<プログラム環境>
Windows XP,VC++6.0,MFC AppWizard(exe),ダイアログベース
<目的>
COMポートから受信した可変長バイナリデータを1.txtに書き込む。
※バイナリエディタを使用せずに16進数で読めるように書く
<質問>
受信したバイナリデータは「02 80 9a 00 b1 56」なのですが、これをテキストファイルに16進数で書き込むことができません。
どのようにしたら良いでしょうか?
今は以下のソースです。
コメントアウト部分はMessageBox等で表示する処理をしています。
先頭1バイト受信→"06"を受信したのでさらに6バイト受信→6バイト書き込む。という順序です。
以下で実行するとファイルには「 00000」と書き込まれました。何なのか全く分かりません・・。
//////////先頭の1バイトだけ受信する/////////////////////////////////////////
DWORD bLError;
unsigned char ucLen;
DWORD dwCount = 1;
DWORD dwRead;
if(ReadFile(hCom,&ucLen,dwCount,&dwRead,&old) == 0){
if(ERROR_IO_PENDING == GetLastError()){
bLError = WaitForSingleObject(hEvent,100);
if(bLError == WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&dwCount,TRUE));//データ受信完了
}
else if(bLError == WAIT_FAILED);//受信スリープエラー
else if(bLError == WAIT_TIMEOUT);//受信タイムアウト
}
else ;//受信エラー
}
//////////先頭データの情報から可変長で読み込む//////////////////////////////
unsigned char rdBuf[256];
unsigned char* prdBuf;
prdBuf = &rdBuf[0];
dwCount = ucLen;
if(ReadFile(hCom,prdBuf,dwCount,&dwRead,&old) == 0){
if(ERROR_IO_PENDING == GetLastError()){
bLError = WaitForSingleObject(hEvent,100);
if(bLError == WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&dwCount,TRUE))));//データ受信完了
}
else if(bLError == WAIT_FAILED);//受信スリープエラー
else if(bLError == WAIT_TIMEOUT);//受信タイムアウト
}
else ;//受信エラー
}
//////////データ書き込み/////////////////////////////////////////////////////
HANDLE hFile;
hFile = CreateFile( ".\\ScanData\\1.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_OVERLAPPED,NULL );
char Buf[256];
char wBuf[256] = "";
wsprintf(Buf,"%#02x",rdBuf);
for(BYTE i=1;i<dwRead;i++){
wsprintf(Buf,"%#02x ",rdBuf[i]);
wBuf[i] = Buf[0];
}
if(WriteFile( hFile, wBuf,dwRead, &wbyte, &old ) == 0){
if(ERROR_IO_PENDING == GetLastError()){
if(WaitForSingleObject(hEvent,1000)==WAIT_OBJECT_0){
if(GetOverlappedResult(hCom,&old,&wbyte,TRUE)){//データ書き込み完了
}}}
else ;//データ書き込みエラー
}
//////////受信したデータ10バイト分をMessageBoxで表示//////////////////////
wsprintf(Buf,"文字 = %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",rdBuf[0],rdBuf[1],rdBuf[2],rdBuf[3],rdBuf[4],rdBuf[5],rdBuf[6],rdBuf[7],rdBuf[8],rdBuf[9]);
MessageBox(Buf);
宜しければ、ご指摘の程よろしくお願いします。
No.2ベストアンサー
- 回答日時:
マルチエントリですね。
>char wBuf[256] = "";
>for(BYTE i=1;i<dwRead;i++){
>wsprintf(Buf,"%#02x ",rdBuf[i]);
>wBuf[i] = Buf[0];
こういうコーディングを見ると、何か高級言語的な感覚が抜けてませんね。
以前のスレッドで、示したやり方を見ましたか?
unsigned char rBuf[256]; //受信バッファ
char wBuf[256]; //出力バッファ
char *wp; //出力バッファのポインタ
wp = wBuf; //出力先を出力バッファの先頭に合わせる
for( int i = 0 ; i < dwRead ; i++ ) {
wp += wsprintf(wp,"%#02x",rBuf[i]);
}
上記のwp += wsprintf(wp,"%#02x",rBuf[i]);の説明
1回目:wp(wBufの先頭)にrBuf[0]の内容を編集して格納する。
wsprintfの戻り値は編集結果のバイト数なので、ここでは4です。
この戻り値をwpに加えるので、wpはwBuf[4]を指すようになります。
2回目:wp(wBuf[4]の所)にrBuf[1]の内容を編集して格納する。
戻り値(4)をwpに加えるので、wpはwBuf[8]を指すようになります。
3回目:wp(wBuf[8]の所)にrBuf[2]の内容を編集して格納する。
戻り値(4)をwpに加えるので、wpはwBuf[12]を指すようになります。
以下同様です。C言語ですから、文字列を編集するにも、出来上がりのバイト数、
次の文字列の格納位置など、自力で管理しなければなりません。
nda23様
非常に分かりやすくご説明して頂きありがとうございました。
ポインタにwsprintfを足す意味がやっと分かりました。
ソースを以下にして、うまく書き込むことができました。
unsigned char rdBuf[256]; //受信バッファ
charwBuf[256];//出力バッファ
char*pwBuf;//出力バッファのポインタ
BYTEwb=0;//出力バイト数
pwBuf = wBuf;//出力先を出力バッファの先頭に合わせる
for(BYTE i=0;i<dwRead;i++){
pwBuf += wsprintf(pwBuf,"%02x ",rdBuf[i]);
wb += wsprintf(pwBuf,"%02x ",rdBuf[i]);
}
WriteFile( hFile, wBuf,wb, &wbyte, &old );
No.1
- 回答日時:
「データ書き込み」のところの for 文が変です.
wsprintf で %#02x を使ってますから, Buf には "0x??" という形式で入ります. で rdBuf[i] = Buf[0] としてますが, このとき Buf[0] は '0' です.
つまり, wBuf は最初が '\0', そのあとは dwByte-1 個の '0' からなる文字列になります.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) VBAのエラーについて 2 2023/08/02 17:46
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UDP受信時の通信異常検知について
-
Outlookの「受信日時」「件名」...
-
recv関数の戻り値について
-
ASP.NET C#でPOST受信
-
VBのMSCommコントロールを使っ...
-
VB2005でTCP/IPソケット通信で...
-
PC98で232c送信winndowで受信で...
-
ネットワークでの受信バイト数
-
TCP/IP のパケットの分断と結合...
-
パソコンに詳しい方教えて下さ...
-
バッチファイルでディレクトリ...
-
CSVファイルのマッピング処理の...
-
Windows上のファイル操作の履歴...
-
ipadで社内ネットワークに接続
-
バックアップ
-
Zipファイルをエクセルに指定変...
-
cronからtarで圧縮しようとする...
-
en_US.UTF-8ロケールってどのPO...
-
指定ファイルをFTPで自動アップ...
-
Win7のPCのサーバー内のファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
Outlookの「受信日時」「送信者...
-
TCP/IP のパケットの分断と結合...
-
シリアル通信時のデータ受信方法
-
UDP受信時の通信異常検知について
-
RS232cを用いた送信プログラム
-
C#にてCTI。RS232Cの受信と送信...
-
VC++メッセージの送受信につい...
-
DHCPOFFERの受信について
-
TCPのプログラミングで質問…と...
-
ネットワークでの受信バイト数
-
パケット受信 recvfrom( )につ...
-
ASP.NET C#でPOST受信
-
recv関数の戻り値について
-
TCPでパケットロス?
-
PC98で232c送信winndowで受信で...
-
VB2005でTCP/IPソケット通信で...
-
「TCPは全二重可能」の意味
-
vb2005でUDP受信時にフォームが...
-
VBのMSCommコントロールを使っ...
おすすめ情報