概要
M5Stamp C3U MATE2台を使いBLE通信にてPC側からの要求に対してSever側のデータを
Client側で1秒毎に受信する プログラムをC#で作成した際、受信エラー(タイムアウト)
となることが多々 あり調べてみました。
<接続概略>
PCソフト(C#)⇔シリアル通信(HWCDC)⇔Client側M5Stamp⇔BLE通信⇔Sever側M5Stamp
調べたこと
1.PCからの要求はSeverに到達していて問題は無さそう。
2.Severからの送信はClientまでは到達してる。
3.ClientからHWCDCを通してのPCへの送信で問題がありそう。
4.ClientのUART⇒外部UART⇔USB変換を使うと問題は発生しない。
5.USBシリアル変換IC搭載のM5Stamp C3 MATEでは問題が発生しない。
M5Stamp C3UではUSBシリアル変換ICを搭載しておらずMCUに直接USBが接続
されています。試しにUSBシリアル変換ICを搭載したM5Stamp C3 MATEをClient側に
使用したところ問題無く送受信できることが分かりました。
また「HWCDC.cpp」ドライバには色々と問題がありそうで 修正版を試したりしましたが
解決できませんでした。
解決策
https://github.com/espressif/arduino-esp32/issues/7779
こちの記事を見ていてHWCDCを通しての送信タイムアウトエラーが関係していそう
でしたので送信タイムアウト時間を設定、バッファも少し大きめに設定、
更に、送信完了待ちを設定したところ PC側での 受信エラーが無くなりました。
タイムアウト時間については送信~受信までで通常50mSec前後、時々最大で160mSec程度
を要していたため余裕を持った300mSecに設定しました。
プログラムとしては1秒毎にデータが取得できれば問題無いためこれでOKとします。
安定した通信を行うためにはUSBシリアル変換IC搭載機種、若しくは外部UART-USB変換を
選定すべきかとも思います。
ちなみにM5StampS3もUSBシリアル変換ICが搭載されておらず同様の問題が発生しますが、
こちらも同じ設定を行うことで安定した送受信が確認できました。
この問題解決まで2カ月ほどかかりました・・。やれやれ。(^^♪
// HWCDCシリアル設定
Serial.setTxTimeoutMs(300); //追加
Serial.setRxBufferSize(100); //追加
Serial.setTxBufferSize(100); //追加
Serial.begin(115200);
// BLE受信⇒シリアル送信
if(receivedflg==true){
Serial.print(rx_Str);
Serial.flush(); //追加 送信完了待ち
receivedflg = false;
}
参考サイト