USBデバイスが削除されたときにシリアルI/Oのプログラム的に中断する-C ++
-
30-09-2019 - |
質問
仮想comポートを介して添付のUSBデバイスを使用してシリアルI/Oが実行されるアプリケーションがあります。デバイスの驚きの除去が検出されると、シリアルI/Oを停止する最良の方法は何ですか。ポートを閉じるだけでいいですか?または、データを送信/受信しようとする前に各シリアルI/O機能でチェックする必要があるデバイスの存在を示すために維持されるグローバル変数がある必要がありますか?または、それは2つ、または何か他のものの組み合わせであるべきですか?ありがとう。
解決
私はあなたがウィンドウを実行していると仮定しています。これは、通信フローをどのように設計したかに依存します。
コンポートオブジェクト(および他の多くの通信オブジェクト)を導出したベースポートオブジェクトがあります。 Comportオブジェクトは、1つのtxthreadクラスとrxthreadクラスを作成します。これらのスレッドは、「オーバーラップ」が読み取りまたは書き込み操作が終了したことを示すのを待っています WaitForMultipleObjects()
.
txthreadsは、何もすることがない場合に眠りにつき、txwrite関数によって目覚めます(メインプロセスとスレッドの間のデータは、trheadセーフFIFOバッファーを通過します)。
この場合、彼らはまた、ポートが閉じたというイベント信号を待つ必要があるため、実際に保留中の操作と出口(トレッドが出て削除される)をキャンセルできます。
USBポートがConnectD/切断されているかどうかを検出するには、Windowsメッセージを聞きます DEVICE_CHANGE
. 。ポートが切断されている場合、イベントを設定し、ポートクラスが削除されてポートを閉じる前にスレッドが終了するのを待ちます。
このアプローチは非常に信頼性が高く安全であることがわかりました。それは私が8年以上前に設計した通信プラットフォームの中核であり、まだキックしています。