ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4017218 16進数の表示ができません。
質問者:meeyooyoo シリアルポートで受信したバイナリデータを表示させると、
正しい値が出ないのですが、どうしてでしょうか?

受信するデータは16進数で
06 02 81 07 00 bb 01 b4 00 32
なのですが、以下のソースで実行すると、
6 2 ffffff80 7 0 ffffffbb 1 ffffffb4 0 32
と表示されました。

また、「データ受信完了」というメッセージが出ないのですが、
出なくてもデータ受信は出来ているのでしょうか?

char szBuf[256];
char rdBuf[10];
char* prdBuf;
DWORD dwCount;
DWORD dwRead;

dwCount = 10;
prdBuf = &rdBuf[0];
if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){
if(ERROR_IO_PENDING == GetLastError()){
if(WaitForSingleObject(hEvent,INFINITE); == WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&dwCount,TRUE)) MessageBox("データ受信完了");
}
}
else MessageBox("データ受信エラー","試作1",MB_ICONSTOP);
}
wsprintf(szBuf,"文字 = %x %x %x %x %x %x %x %x %x %x",
rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]);
MessageBox(szBuf);

よろしくお願いします。
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/12 19:22
この質問に対する回答は締め切られました。

回答良回答10pt

ANo.3 あと"6"でなくて"06"と表示して欲しいなら"%x"でなくて"%02x"とするとよいと思います。
ReadFile()関数は成功すると0以外の値を返すようですから、受信成功すると終わりから3行目のwsprintf()まで飛んでくるんじゃないですか。ですから"データ受信完了"とかその辺の処理は一切通らないかと。
回答者:dummyplug
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/12 20:03
この回答へのお礼有難うございます。
%02xにして、欲しかった形で表示できるようになりました。

回答良回答20pt

ANo.2 0x80以上のコードが符号拡張されたためです。
rdBufは符号なしで定義すればよいでしょう。
unsigned char rdBuf[10];
回答者:nda23
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/05/12 19:42
この回答へのお礼ご指摘の通り修正してうまくできました。
有難うございました。

回答

ANo.1 http://www.google.co.jp/search?q=C%E8%A8%80%E8%AA%9E%20unsigned&...
unsigned char でやったらどうなるかな?
回答者:SAYKA
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/12 19:40
この回答へのお礼ご指摘の通り修正してうまくできました。
有難うございました。