仮想 COM ポートを介して接続された USB デバイスでシリアル I/O が実行されるアプリケーションがあります。デバイスの突然の取り外しが検出された場合、シリアル I/O を停止する最善の方法は何でしょうか。ポートを閉じるだけですか?または、デバイスの存在を示すために維持されるグローバル変数が必要であり、データの送受信を試みる前に各シリアル I/O 関数でチェックする必要がありますか? それとも、2 つを組み合わせたものにするべきでしょうか、それとも別のものにするべきでしょうか? ありがとう。
1 に答える
私はあなたがWindowsを実行していると仮定しています。これは、コミュニケーションフローをどのように設計したかによって異なります。
COMPortオブジェクト(および他の多くの通信オブジェクト)を派生させたBasePortオブジェクトがあります。COMPortオブジェクトは、1つのTXThreadおよびRXThreadクラスを作成します。これらのスレッドは、「OVERLAP」が読み取りまたは書き込み操作がで終了したことを通知するのを待っていWaitForMultipleObjects()
ます。
TXThreadsは、何もすることがない場合にスリープ状態になり、TXWrite関数によってウェイクアップします(メインプロセスとスレッド間のデータは、trheadセーフFIFOバッファーを通過します)。
この場合、ポートが閉じたことを示すイベントシグナルを待つ必要もあるため、保留中の操作を実際にキャンセルして終了できます(トレッドが終了して削除されます)。
USBポートが接続/切断されているかどうかを検出するために、WindowsメッセージをリッスンしますDEVICE_CHANGE
。ポートが切断されている場合は、イベントを設定し、スレッドが終了するのを待ってから、Portクラスがポートを削除して閉じます。
このアプローチは非常に信頼性が高く、安全であることがわかりました。これは、私が8年以上前に設計し、今でもキックしているコミュニケーションプラットフォームの中核です。