- ベストアンサー
C++プログラムで通信データが変化しない理由と解決方法
- C++のプログラムにおいて、readfile関数を使用してPICからPCへデータを送信する際に、通信開始してからPICからのデータを変化させても受信データが変化しない現象が発生します。
- 問題の解決方法としては、以下の点を確認してみてください。1つ目は、通信設定の正確性を確認してください。2つ目は、通信速度やボーレートに関する設定を再確認し、適切な値に設定してください。3つ目は、データの受信方法に問題がないかを確認してください。
- これらの確認を行うことで、通信データが正しく受信されるようになる可能性があります。しかし、すべての問題を解決できるわけではないため、他の原因も考慮する必要があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
掲示のコードだけではなんとも言えませんが……。 >PIC側では最初'A'を出力していて、 出力「し続けて」いるんですか? 単発で'A'を出力しているんですか? 出力し続けているのであれば…… >ReadFile(comHandle,&data_a,1,&lRead,NULL); は、「PCの受信バッファから1文字読み込み」しているだけなので 【'A'が受信バッファに溜まっているから】 >PIC側の信号を'B'に変化させて >'G'を押しても'B'と表示されずに'A'と表示されてしまいます。 なのではないですか? なお…PC側の受信バッファがいっぱいになった後で受信したデータがどうなるのか…は、通信の仕様による…かと。 # ハードウェアフロー制御していて送信を止めているのか、バッファに入らないデータは捨てているのか……
その他の回答 (4)
あくまでも想像です。ご注意下さい。 PICから、Aを連続して出力していませんか? もしそうだとすると、PC側の受信バッファに連続したAが格納されています。 プログラムでは、Gが押下された時に1文字しかでデータを読み取りません。 残りは、バッファの中です。 バッファをクリアしない状態で、信号がBに変わったとしても、バッファの最後にBが追加されるので、いくらGを押下したとしてもバッファ内の全てのAが読み出されるまでは、Bは取得できません。 解決策は、全てのデータをReadFileで読み込み、最後の1文字を採用する事です。 バッファにある最後の1文字が最新のPIC送信データだからです。 全てのデータを読み込むとは、ループなどで何度も繰り返しReadFileを利用して、もうバッファからデータが読み出せなくなるまで読み込むと言う事です。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
それと、ReadFile関数の戻り値が「0」の時はエラーなんだけど、このエラーには2種類ある。 1つは「タイムアウトした」など、続けてReadFile関数を呼び出して良い場合。 1つは「相手側からポートが閉じられたため、ハンドルは既にクローズされている」など、それ以上ReadFile関数を呼び出してはいけない場合。 この辺りもちゃんとチェックしないと「読めてないのに、読んだつもりになって、前の状態を表示し続ける」って事になります。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
あと、ReadFile関数の戻り値が「0以外」かどうかもチェックしないといけない。 ReadFile関数の戻り値が「0」の時は、エラーで帰って来てるから、データは読み込まれない。データが読み込まれないなら、変数の値は変化しないから、何度'G'キーを押しても、'A'しか表示されない。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
ReadFile関数を呼び出したあと、関数から帰って来たら、読み込めたバイト数を表示してみよう。 たぶん「読み込めたバイト数」が「0」になってると思う。 >ちなみにPICの信号がちゃんと変わっているかはcheck済みです。 PICのデータバスの信号が変化してても、制御信号が上手く変化して無かったら「データは来てない」って事になるので、PCは「データが無かった」って言って、読み込めたバイト数が「0」で返って来る。 読み込めたバイト数が0なら、読み込み用の変数は変化しないから、何度Gキーを押しても、最初に読まれた'A'しか表示しません。