2

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 ビットすべてをサポートしていないことに気付きませんでした。

4

3 に答える 3

4

送信側を疑う傾向があります。送信側は正常に動作していますか? Wireshark キャプチャなどで確認しましたか?

于 2011-01-07T05:07:26.520 に答える
3

63 は ? の ASCII コードです。値にはある程度の関連性があります。ASCII には 127 を超える値の文字コードはありません。ASCII エンコーダーは通常、このような無効なコードを疑問符に置き換えます。たとえば、.NET Encoding.ASCII エンコーダーの既定の動作。

それがどこで起こるかは正確には明らかではありません。間違いなくあなたのスニペットにはありません。おそらく電線の向こう側にいるのだろう。文字ではなく、バイトを書き込みます。

于 2011-01-07T05:26:46.963 に答える
0

Hans Passant と Karl Bielefeldt の場合は +1。

エンコードせずにデータをそのまま送信できますか? データはどのように送信されますか? TCP/UDP/IP/Ethernet は、バイナリ データの送信を無制限にサポートします。これが不可能な場合は、データを 16 進数に変換すると問題が解決する可能性があります。Base64 も (より良い) 動作しますが、かなり手間がかかります。少量のデータの場合、16 進数がおそらく最も簡単で最速のソリューションです。

Wiresharkについて言及したKarlとBenに再び+1。このようなネットワークの問題をデバッグするのに非常に役立ちます。

于 2013-11-06T16:01:10.427 に答える