- ベストアンサー
シリアル通信でのデータ受信
- シリアル通信にてデータを連続的に受信するプログラムを作成する際に、フが多く表示される、最後の改行がされていない、データが失われる、1サイクルの値が2サイクル目にも残るという問題が発生しています。解決方法を教えていただきたい。
- シリアル通信にてデータを連続的に受信するプログラムを作成する際に、フが多く表示される、最後の改行がされていない、データが失われる、1サイクルの値が2サイクル目にも残るという問題が発生しています。解決方法を教えていただけると助かります。
- シリアル通信にてデータを連続的に受信するプログラムを作成している際に問題が発生しています。フが多く表示され、最後の改行がされていない、データが失われる、1サイクルの値が2サイクル目にも残るという問題があります。解決方法を教えていただけますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
先ほどの訂正と追加です。 3.dcb.Bytesizeを8にして、while文を無限ループにし (countのif~break文を削除し), strlen(buff)のところを BYTE_SIZEにしてみてください。データが取りこぼしなく 表示されませんか。 #通信が終わらないという問題は、受信ができない問題 とは別問題なので、今は考えていません 4.3.でデータの取りこぼしがあれば、送信側・受信側とも、 BaudRateを低く(9600bpsとか)してみて改善されるかどうか、 確認してください。 データの取りこぼしが通信速度によるものなら、フロー制御など も考えないといけませんね。ところで、今頃聞くのもなんなんですが、 送信側・受信側は、どのような環境をお使いなんでしょう?
その他の回答 (3)
- hidebun
- ベストアンサー率50% (92/181)
もう少し具体的に情報を書いてもらったほうが、 回答するのが楽になります。 とりあえず、以下の点については、どうでしょうか? 確認事項 1.COM2に正常にデータが送信されてきていますか? (ハイパーターミナル等を起動して、データ受信を確認する) 2.dcb.Bytesizeを7、8にすると受信に失敗するとありますが、 具体的にはどういう風に失敗するのでしょうか? #やはり5000という値は、おかしいと思います。 なぜに5000?化けたり、ロストとしたりは、 この辺りが原因のような気もしますが。 3.dcb.Bytesizeを8にして、while文を無限ループにし (countのif~break文を削除し), strlen(buff)のところを 100とすると、受信したデータが画面に表示されませんか?
- hidebun
- ベストアンサー率50% (92/181)
#defineでSTOP_BITとF_PARITYの名前と値の対応関係がおかしい気がしますが、 とりあえず、値をセットする側でうまく(?)吸収されてますね。 ところで、dcb.ByteSizeが5000になりますが、ここは、1バイトのビット数を 指定する場所ですね。通常7か8を指定するはずですが、5000としているのは、 何か理由があるのでしょうか。 また、main関数のReadData(buff, strlen(buff))の部分ですが、buffが 初期化されていないので、strlen(buff)がどのような値になるかわからない 気がするのですが、その辺りはいかがですか。 strlen(buff)の部分を100とかの固定値にすると、結果はどのようになりますか? シリアル通信について、私も初心者なので、この辺りからのアプローチしか できませんが、問題解決の一助になれば幸いです。
- hidebun
- ベストアンサー率50% (92/181)
ReadFileで取得したデータの最後に、 buff[dwRead] = '\0'; を忘れているから、print文でおかしな場所まで 表示してしまっているのではないでしょうか。
お礼
ご回答ありがとうございます. 確かに配列の文字列の最後を記すのを わすれていました.ありがとうございます. \0をつけてみました. フの表示はなくなったのですが, 今度は各行の先頭に■がつくようになりました. また,データがサイクルごとにロストする. のはなおっていません.
お礼
たびたびありがとうございます. お礼が遅くなり申し訳ありません. dcb.bytesizeを7あるいは8とすると データの受け取りで失敗してしまうのです・・・