みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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 指定ポート,

--------------------------------------------------------
そこで,送信データをバイナリデータとして扱う関数を使う必要があると思います。
ただ,いろいろ調べたのですが,バイナリデータとして読み書きする関数が分からず困っています。
そのため,バイナリデータとして扱う関数とその使用例を教えていただきたいです。

プログラム初心者のため,問題解決のために必要なコードや情報が不足していることがあるかと思います。
その際にはご指摘いただきたいと思います。

投稿日時 - 2016-05-12 17:42:20

QNo.9171531

困ってます

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

その送信のプログラムは問題無いです。
WriteFileの戻り値は、成功すれば「1」で失敗すれば「0」ですが、これはどうなっていますか?
あと、dwWrittenには実際に送信できたバイト数が入ります、それは6が入っていませんか?
戻り値が失敗だったり、送信データ数が少なかったら、通信相手や他の問題だと思います。

参考URL:http://infoseek_rip.g.ribbon.to/spectrum123.at.infoseek.co.jp/vb/vb_2/vb_2.htm

投稿日時 - 2016-05-13 02:24:05

お礼

回答ありがとうございます。
dwWrittenにはちゃんと6が入っていました。
WriteFileの戻り値が0で失敗していたので,質問者様の言うように通信相手や他の問題だと思いますので,そこをあたってみます。
このような初歩的な問題に丁寧に答えてくださりありがとうございました。

投稿日時 - 2016-05-13 12:01:45

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>0x00の時点で文字列の最後と判断されてしまい,それ以降を送受信することができていないと考えているのですが,それは間違いなのでしょうか。

https://msdn.microsoft.com/ja-jp/library/cc429856.aspx
を読んで、どこかにそのような動作をするようなこと書かれていますか?

投稿日時 - 2016-05-13 04:16:03

お礼

たびたび回答ありがとうございます。
readfileでの受信の失敗がバイナリデータとして送信できていないためだと勘違いしていました。
大変お騒がせいたしました。

投稿日時 - 2016-05-13 11:58:39

ANo.2

WriteFileはバイナリデータを扱える関数のはずですが、何故違うと思ったのでしょうか?
0x00 を終端として扱うのは、文字列処理関数だけです。

投稿日時 - 2016-05-12 23:11:23

お礼

回答ありがとうございます。
readfileでの受信の失敗がバイナリデータとして送信できていないためだと勘違いしていました。

投稿日時 - 2016-05-13 11:56:40

ANo.1

ReadFile,WriteFileでバイナリデータの読み書きできますけど?

投稿日時 - 2016-05-12 19:24:05

補足

そうなのですか?
0x00の時点で文字列の最後と判断されてしまい,それ以降を送受信することができていないと考えているのですが,それは間違いなのでしょうか。

上記のコードで下記の送信コマンドを送ることができているということでしょうか。
02 00 C0 10 03 D0
おそらく非常に初歩的なことを聞いてしまっているかとは思いますが,よろしくお願いします。

投稿日時 - 2016-05-12 19:34:50

あなたにオススメの質問