LEDマトリックスを制御するためにコントローラーにデータを送信するために、公式のイーサネットシールドを備えたArduino(duemilanove)を使用しています。デスクトップ上の 32 ビット値の 4 バイトを取り、それを arduino に 4 つの連続したバイトとして送信することにより、生の 32 ビット符号なし int 値 (UNIX タイムスタンプ) をコントローラーに送信しようとしています。ただし、バイト値が 127 より大きい場合は常に、イーサネット クライアント ライブラリによって返される値は 63 です。
以下は、私がarduino側で行っていることの基本的な例です。見栄えを良くするために、いくつかのものは削除されています。
byte buffer[32];
memset(buffer, 0, 32);
int data;
int i=0;
data = client.read();
while(data != -1 && i < 32)
{
buffer[i++] = (byte)data;
data = client.read();
}
したがって、入力バイトが 127 より大きい場合は常に、変数「データ」が 63 に設定されます! 最初は、問題はさらに先にあると思っていましたが (バッファは以前はバイトではなく char でした)、読み取りの直後に「データ」を出力すると、まだ 63 のままです。
これを引き起こしている可能性のあるアイデアはありますか?client.read() は int を出力することになっており、内部的にはソケットからデータをフルバイトで符号なしの uint8_t として読み取るので、少なくとも 255 までは行けるはずです...
編集:そうです、ハンス。Encoding.ASCII.GetBytes が最初の 7 ビットのみをサポートし、8 ビットすべてをサポートしていないことに気付きませんでした。