レシピデータサイズが分割が必要なほど大きい(20000Byte)場合に失敗している
・波形を比較すると、データ送信の最小束(8 Byte これは添付のModule.cpp -> WriteCom() のwsize)
毎の間隔がWin7では1ms程度あるのに対し、Win10でが詰まっている(数十usオーダー)
・装置側では分割受信データが19998Byteに満たず、BCCチェックでエラーが出ているが、
UARTのバッファオーバーラン等のエラーは起きていない
・Module.cpp -> WriteCom()内で128 Byte単位で送信間隔をあけると正常に動作する
これはFT232Rの送信バッファサイズと一致する
以上よりFTDIの232C-USB変換チップ(FT232R)内の送信バッファがあふれてデータの取りこぼしが起きていると判断
Module.cpp -> WriteCom()内で128 Byte未満の送信ごとにSleep(2)する処理を入れて暫定対策とした。
しかしたまに失敗するので念のためリトライ回数を1回増やした。
本来はFT232Rの送信バッファサイズを見てあふれそうになったら間隔をあける処理を入れたいが、
FTDIのdll関数にそれを取得するものが見つからない。
(FT_GetStatusで送信バッファのキュー数が取得できるだが、送信後すぐに読み出しても0だった。
おそらく、チップのキューではなくドライバのキューを取得しているのではないか?)
一応これで全く送れないという状態からは改善したが、いくつか問題があるので
下記改善可能かご検討が必要。
(1)上記FTDIチップ内の送信バッファキューサイズ(又は空きサイズ)が取得できるか?
(2)現対策ではWin7で動かしたときに無駄なSleepが発生して遅くなる
Visual C++ 6.0 から動作OSの識別を行い、Win10の場合のみSleepを行うことは可能か?
(3)Wi7のように8 byte毎に1ms以下の間隔をあけてみたいが、
ループ処理毎にSleep(1)としても実際は数msの間隔になってしまう。
Visual C++ 6.0で正確に1msの間隔をあける、もしくはusオーダーのウェイトは可能か?
コメントを残す