2017-05-08 15 views
0

私はこの質問が何度も尋ねられていることを知っています。私はhex bytesを介してserial communicationubuntuに少ししか得られないという問題に直面しています。私はすべてのデータを読み込んで表示する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進数を表示します。

実際には、配列内にFFAAのような各バイトを保存する必要があります。しかし、当分の間、私は最初にそれを表示することを考えました。何が問題なのか。なぜ16進バイトを表示していないのですか?誰も私にこれについての提案を与えることができます。私はまた、シリアル経由で16進バイトを送信するときに、受信側はそれをどのように受け取るべきかを知る必要があります。それはintまたはstringsとして保存する必要があります。ありがとう!

+2

'printf'の出力は、' buf'の最初の要素のベースアドレスをシステムに依存する*ポインタ*として出力しているためです。 ['%p'が' printf'の書式指定子として何をしているかを参照してください。](http://en.cppreference.com/w/c/io/fprintf)。要するに、それはあなたが思っていることをしません。 *ループ*が必要です。そして、あなたの 'buf'は0..254からインデックス可能です。その 'read'呼び出しが255オクテットで完全に生成された場合、後続の行の不要なターミネーター配置は、*未定義の動作*を呼び出します。 – WhozCraig

+0

@WhozCraig Ok。あなたはループが必要であり、各バイトを個別に変換し、それらをバッファに保存することを意味します。(int i = 0; i

+1

printf( "\ n"); 'あなたのバッファにはすでにそのvalkuesが含まれているので、それらを変換する必要はありません。 printfを使って何をしているのかは、それらをASCII形式で印刷します。 – LPs

答えて

5

これはprintf()にポインタを与え、16進ダンプを表示することを期待していますまるでそれが文字列であるかのように。それはそれが動作する方法ではありません。ない内容、ポインタのポイントへのポインタアドレスをダンプするために使われているのprintfの

unsigned char buf[255]; 

res = read(fd,buf,255); 
// AN HEX BUFFER IS NOT A STRING DO NOT TERMINATE IT 
// buf[res]='\0'; 

printf("data: "); 
for (int i = 0; i < res; ++i) 
    printf("%02x ", (int)buf[i]); 

printf("\n"); 

オプション%pを

あなたはこのような何かを行う必要があります。

+0

ありがとう私は、16進バイトが含まれている場合、文字列を終了する必要はないことを知りませんでした。また、私はsprintfを使って、変換された16進バイトを配列に保存しようとしていました: 'unsigned char hexarray [255]; sprintfの引数1は、キャストなしで整数からポインタを作るが、ポインタは整数ではないが、 bufはすでにcharです。変換された16進値を別の配列に保存するには –

+0

さらにもう一つは、printfの出力は 'FF AA 2E 0F CC 0A'です。 'FF AA 2E 0F CC 0D'でなければなりません。最後のバイトの0Dが変換されています。 –

+0

私は問題が改行タイプだと思うが、\ r(0x0d)がシリアル通信の\ n(0x0a)に変換されている可能性があります。送信者が確かなウィンドウの場合。 – gabry

3
printf("data: %p\n",buf); 

あなたは六角でBUFを表示するには%p を使用していたので、これは、変数BUFのアドレスを印刷して、あなたは私が実際に必要な文字

printf("data: %.2X\n",buf[i]);// i from 0 to res 

」によってループ文字でそれを印刷する必要がありますFFやAAのような各バイトを配列に保存してください。 " これはあなたの配列ieすなわちbufで、16進数で表示したい場合は正しく印刷する必要があります

+0

私は表示したくありません。私はちょうど配列の正しい形式で16進バイトを保存する必要があります。そのため、後で配列要素を使用できます。 –

関連する問題