pyserialモジュールを使用してシリアルデバイスのホットプラグをテストするスクリプトを書いています。スクリプトには、書き込みを処理する1つのメインスレッドと、データを読み取るための読み取りスレッドがあります。
メインスレッドはホットプラグ信号を送信し、デバイスが読み取りスレッドを再開したときにデバイスが再び検出されるまで、読み取りスレッドを停止します。メインスレッドは、ホットプラグ成功メッセージを待って(タイムアウト付きで)ホットプラグ成功を確認し、ホットプラグメッセージの送信を再開します。この問題は、接続時の最初のホットプラグ成功メッセージの後にシリアルデバイスが初期化メッセージを送信するときに発生します。
スクリプトは初めて正常に実行されます。ただし、2回目は、入力シリアルバッファに、新しい成功メッセージと初期化メッセージを読み取る前に最初に読み取る必要のあるデータ(initメッセージ)が残っています。これを行うと、スクリプトがタイムアウトしたときに成功メッセージが失われます。
ホットスワップで読み取りスレッドを開始する前に、シリアルバッファを完全にフラッシュし、コンテンツを破棄したいと思います(つまり、ホットスワップの前にどのメッセージを受信したかは関係ありません)。ホットプラグ成功メッセージを受信した後、ser.flushInput()/ flushOutput()/ flush()メソッドを使用しようとしましたが、何も実行されません。データは引き続きバッファから読み取られます。次の反復の前にtime.sleep(5)を導入することで回避策を実行できますが(バッファからすべてのinitを読み取るため)、これに対するよりクリーンなアプローチが必要です。
成功メッセージを受け取ったら、入力バッファ内の以前のinitメッセージを完全に破棄して、次の反復でホットスワップの前に読み取るものがないようにするにはどうすればよいですか。コードが大きすぎて投稿できないため、以下のシーケンス図で問題が明確になることを願っています。
更新:入力をフラッシュできないことをどこかで読みました。これは、Cのような未定義の動作の1つです。EOF/EOLまで読みました...
Device Main Read Device
-start->
<-Hotplug- -stop->
-DevcieAlive->
<-open-- -start->
<-( success + init )-
<-success-
ok
<-Hotplug- -stop->
-DeviceAlive->
<-open- -start->
<-( old init + success + init )
timeout
<-close- -stop->