• ベストアンサー

バイナリデータの書き方が分かりません・・。

シリアルポートでバイナリデータを送信したいのですが、バイナリをどう書けがいいのか分りません。 送りたいコードは16進数で02 00 02 00です。 以下のソースの"123"の部分を書き換えるのだと思うのですが、どう書けば良いのでしょうか? よろしくお願いします。 char* wbuf; DWORD wbyte; lstrcpy(wbuf,"123"); WriteFile(hCom,wbuf,lstrlen(wbuf),&wbyte,&old

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

データの仕込み char wbuf[4] = {0x02,0x00,0x02,0x00}; データの出力 WriteFile(hCom,wbuf,sizeof(wbuf),&wbyte,~ 可変長データの場合は別にバイト数を管理する情報が必要です。 C言語のお約束として、テキストでは終端にNull文字を置きます。 lstrlenはこのNull文字までのバイト数を数えるので、バイナリでは使用できません。

meeyooyoo
質問者

補足

有難うございます! 可変長データなので、バイト数を管理しないといけないのですね。 その方法も、宜しければ教えて頂けますか? lstrlenが使えないとなると、文字数のカウントはどうしたらいいのでしょうか・・?

その他の回答 (1)

  • tig33
  • ベストアンサー率50% (6/12)
回答No.2

>文字数のカウントはどうしたら・・? 現在送りたいコードは、4バイトですから、カウントするのではなく、直接バイト数を指定すれば良いだけです。 WriteFile(hCom, wbuf, 4, &wbyte, &old・・・

関連するQ&A

  • WriteFileで送信できたかの確認方法は?

    シリアルポートで非同期でバイナリを送信するプログラムを作成しています。 以下のソースでバイナリを送信したつもりなのですが、本当に送信できているのか分りません。 送信が完了したのか確認するにはどうしたいいでしょうか? よろしくお願いします。 COMのオープン、DCBの設定は恐らく問題ないので、 WriteFileの周辺を抜粋します。 OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = NULL; char wbuf[7] = {0x02,0x0C,0x01,0x00,0x31,0x15,0x1A}; DWORD wbyte; if(!WriteFile(hCom,wbuf,(DWORD)sizeof(wbuf),&wbyte,&old)){ if(ERROR_IO_PENDING == GetLastError()){ GetOverlappedResult(hCom,&old,&wbyte,TRUE); } else MessageBox("エラー"); }

  • バイナリ送信で出るエラーコードの意味が分かりません

    シリアルポートでバイナリを非同期で送信するプログラムを作成しています。 以下のソースで実行すると、「重複したI/O処理を実行しています」というエラーがでました。 何が間違っているのか分りません・・。 どうかご指摘お願いします。 void CMyDlg::OnReset() { //COMポートオープン HANDLE hCom; hCom = CreateFile( "COM4", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); //通信設定 DCB dcb; GetCommState(hCom,&dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hCom,&dcb); OVERLAPPED old; // オーバーラップ構造体の初期化 ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = NULL; //データ送信 char wbuf[7] = {0x02,0x00,0x01,0x00,0x31,0x15,0x12}; DWORD wbyte; WriteFile(hCom,wbuf,sizeof(wbuf),&wbyte,&old); //エラーコード取得&文字列に変換&表示 LPVOID lpMessageBuffer; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),//エラーコード取得 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL ); MessageBox((LPCTSTR)lpMessageBuffer); //メッセージボックス LocalFree( lpMessageBuffer ); //COMポートクローズ CloseHandle(hCom); }

  • バイナリを16進数で表示したい

    VC++6.0,MFC,ダイアログベースでバイナリデータ受信とファイル書き込みのプログラムを作っています。 COMポートからバイナリを10バイト受信し、受信した内容を1.txtに書き込み、1.txtを開いて、受信した内容を確認したいです。 以下のソースで実行すると、1.txtにはFフフフフフフフフフと書かれていました。これを16進数で表示させたり、10進数で表示させるにはどうしたらいいでしょうか? /////////データ受信////////////// unsigned char rdBuf[10]; unsigned char* prdBuf; DWORD dwCount; DWORD dwRead; prdBuf = &rdBuf[0]; dwCount = 10; 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)){ //"データ受信完了" }}} else //エラー } /////////ファイルに書き込む////////////// HANDLE hFile; hFile = CreateFile( ".\\ScanData\\1.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL ); if(WriteFile( hFile, rdBuf,10, &wbyte, &old ) == 0){ if(ERROR_IO_PENDING == GetLastError()){ if(WaitForSingleObject(hEvent,INFINITE)==WAIT_OBJECT_0){ if(GetOverlappedResult(hCom,&old,&wbyte,TRUE)){ //書き込み完了 }}} else //書き込み失敗 }

  • 可変長バイナリを読み込みたい

    <プログラム環境> Windows XP,VC++6.0,MFC AppWizard(exe),ダイアログベース <目的> COMポートから可変長のバイナリデータを受信する <質問> 受信するバイナリの長さは受信した内容で分かるようになっています。 例えば、 先頭が"0x0b"であれば11個のバイナリが続いて送られてくるという感じです。 この例ように、送られてくる内容("0x0b")を確認して、それに応じて 11個データを読み込む、というプログラムにするには、どのようにしたら良いでしょうか? 今は以下のソースで、バイナリの長さを指定して受信しています。 //////////オーバーラップ構造体の初期化////////// OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = hEvent; //////////データ受信//////////////////////////// unsigned char rdBuf[10]; unsigned char* prdBuf; DWORD dwCount; DWORD dwRead; prdBuf = &rdBuf[0]; dwCount = 10; 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)){ //"データ受信完了" }}} else //エラー } 宜しければ、ご指摘の程よろしくお願いします。

  • バイナリをテキストファイルに書き込みたい

    <プログラム環境> 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); 宜しければ、ご指摘の程よろしくお願いします。

  • ReadFileでエラーが出ます。

    シリアルポートで非同期でバイナリを受信するプログラムを作成しています。 受信部分は以下のソースです。これで実行すると「データ受信エラー」のダイアログが出ます。 GetLastErrorでは998(メモリ ロケーションへのアクセスが無効です。)が得られました。 ネットで調べましたが何が原因かも分かりません・・。 どうかアドバイスお願いします。 HANDLE hEvent; hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); OVERLAPPED old; ZeroMemory( &old, sizeof(old) ); old.Offset = 0; old.OffsetHigh = 0; old.hEvent = hEvent; DWORD dwCount; char* rdBuf; DWORD dwRead; if(!ReadFile(hCom,rdBuf,dwCount,&dwRead,&old)){ if(ERROR_IO_PENDING == GetLastError()){ GetOverlappedResult(hCom,&old,&dwRead,TRUE); } else MessageBox("データ受信エラー","試作1",MB_ICONSTOP); }

  • WriteFileのエラー995は何が原因?

    <プログラム環境> Windows XP VC++6.0 MFC AppWizard(exe) ダイアログベース <症状> 以下のコード部分は、これまでエラーは無かったのですが、 他の部分をいろいろといじった結果以下のコードでエラーが出るように なりました。 HANDLE hCom;//COMポートのハンドル OVERLAPPED old;//構造体 unsigned char ucBuf[];//送信する内容 DWORD dwByte;//送信するバイト数 //上記変数は宣言後、正しい値を入れています。 BOOL blRet;//実行結果 if(WriteFile(hCom,ucBuf,dwByte,NULL,&old) == 0){ blRet = GetLastError(); } を実行後、blRetの結果を確認すると995で、 「スレッドが終了したか、またはアプリケーション要求によって、I/O 処理が中止されました。」 が出ました。 <質問> このエラーは何が原因でしょうか? 宜しければご指摘の程よろしくお願いします。

  • シリアル通信でのバイナリデータの送受信方法

    visual studio 2008 c++ を用いて 0x00~0xFFの任意のバイトをシリアル通信で送受信するプログラムを書いています。 0x00(NUL)を含んだ文字列は、文字列処理関数では処理出来ないので、以下のようにプラグラムを書くと文字列の最後を示すのに NULL を使っている処理系なので、文字列として読み込みをしているため,NULLで止まってしまいます。 -------------------------------------------------------- 略 DWORD dwWritten; char sendBuf[32]={0}; sendBuf[0] = 0x02; //02 STX sendBuf[1] = 0x00; //00 長 sendBuf[2] = 0xC0; //C0 取得コマンド sendBuf[3] = 0x10; //10 取得コマンド sendBuf[4] = 0x03; //03 ETX sendBuf[5] = 0xD0; //D0 Sum WriteFile(hComm, sendBuf, 6, &dwWritten, NULL); //hComm 指定ポート, 略 -------------------------------------------------------- そこで,送信データをバイナリデータとして扱う関数を使う必要があると思います。 ただ,いろいろ調べたのですが,バイナリデータとして読み書きする関数が分からず困っています。 そのため,バイナリデータとして扱う関数とその使用例を教えていただきたいです。 プログラム初心者のため,問題解決のために必要なコードや情報が不足していることがあるかと思います。 その際にはご指摘いただきたいと思います。

  • 16進数の表示ができません。

    シリアルポートで受信したバイナリデータを表示させると、 正しい値が出ないのですが、どうしてでしょうか? 受信するデータは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); よろしくお願いします。

  • PICのシリアル通信のWIN_APIプログラムについて

    PICとPCとのシリアル通信の WIN_APIプログラムについてどなたかご存知の方は教えてください. 現状,API関数を用いて,シリアル通信をできるようにプログラムを作成したのですが,送信はできるのですが,受信データが"C0"をPICから送付しているのに,"FFFFFFFC0"と受信されてしまいます. 先の"FFFFFFF"をとるにはどうしたらいいでしょうか? 現状:受信プログラム // シリアルポートに対する書き込み(PICに送信命令) WriteFile(hCom, w_com_Buf,lstrlen(w_com_Buf), &n, 0 ); // シリアルポートに対する読み込み ReadFile(hCom, s_com_Buf,1, &n, 0 ); mikroC上のUSARTターミナルでは送受信は適正で, 上記のプログラマで 送信はPIC側で受信していることは7SEGを使って確認しています. しかし,PC側では, s_com_Buf[0]には,"C0"が入ったり,"FFFFFFC0"が入ったりします. PICは現状,多チャンネルAD変換をしているため, 送信に対する受信データのやり取りができなくて困っています. どなたか先生教えてください.

専門家に質問してみよう