私はこの質問が何度も尋ねられていることを知っています。私はhex bytes
を介してserial communication
でubuntu
に少ししか得られないという問題に直面しています。私はすべてのデータを読み込んで表示するCコードを書いています。多くの文字列でテストしたところ、うまくいきました。また、別のシステムではウィンドウと、Docklight
というソフトウェアを実行しています。このソフトウェアは私に16進バイトを与えており、私はそれをアプリケーションで受け取る必要があります。 六角バイトは以下のようなもの:Cの16進バイトは印刷できません
FF AA 2E 0F CC 0D
Iは、ヌル・モデム・ケーブルを介してシステムの両方を接続しています。 16進バイトを出力するために、printf文に%02X
を含める必要があります。これを行うと、それは私にformat ‘%X’ expects argument of type ‘unsigned int’, but argument 2 has type ‘unsigned char *’
の警告を与えました。私はこれについて調べて、%p
と置き換えました。
unsigned char buf[255];
res = read(fd,buf,255);
buf[res]='\0';
printf("data: %p\n",buf);
printf文の出力はdata: 0x603380
次のとおりです。ここでは、コードです。それはすべてのバイトを組み合わせているため、printf関数の出力があるÿª.\017Ì\n
のようなランダムな文字があることも示して、なぜ今私は本当に知らない
Name : buf
Details:"ÿª.\017Ì\n", '\0' <repeats 248 times>
Default:0x603380 <buf>
Decimal:6304640
Hex:0x603380
Binary:11000000011001110000000
Octal:030031600
:私は以下の通りです正確な値を見るためのbuf変数をオープンしましたその1つに16進数を表示します。
実際には、配列内にFF
とAA
のような各バイトを保存する必要があります。しかし、当分の間、私は最初にそれを表示することを考えました。何が問題なのか。なぜ16進バイトを表示していないのですか?誰も私にこれについての提案を与えることができます。私はまた、シリアル経由で16進バイトを送信するときに、受信側はそれをどのように受け取るべきかを知る必要があります。それはint
またはstrings
として保存する必要があります。ありがとう!
'printf'の出力は、' buf'の最初の要素のベースアドレスをシステムに依存する*ポインタ*として出力しているためです。 ['%p'が' printf'の書式指定子として何をしているかを参照してください。](http://en.cppreference.com/w/c/io/fprintf)。要するに、それはあなたが思っていることをしません。 *ループ*が必要です。そして、あなたの 'buf'は0..254からインデックス可能です。その 'read'呼び出しが255オクテットで完全に生成された場合、後続の行の不要なターミネーター配置は、*未定義の動作*を呼び出します。 – WhozCraig
@WhozCraig Ok。あなたはループが必要であり、各バイトを個別に変換し、それらをバッファに保存することを意味します。(int i = 0; i
printf( "\ n"); 'あなたのバッファにはすでにそのvalkuesが含まれているので、それらを変換する必要はありません。 printfを使って何をしているのかは、それらをASCII形式で印刷します。 – LPs