2010-12-02 7 views
0

私はシリアルI/Oが接続されたUSBデバイスで仮想COMポート経由で行われるアプリケーションを持っています。デバイスの突然の取り外しが検出されたら、シリアルI/Oを停止する最良の方法は何でしょうか。私は単にポートを閉めるべきですか?または、デバイスの存在を示すために保持されているグローバル変数がある場合は、データの送受信を試みる前に各シリアルI/O関数でチェックする必要がありますか?それとも、2つの組み合わせか、それとも別のものか?ありがとう。USBデバイスが取り外されたときにシリアルI/Oをプログラム的に中断する - C++

答えて

1

私はあなたがWindowsを実行していると仮定しています。 これは、通信フローの設計方法によって異なります。

私は、私がCOMPortオブジェクト(および他の多くの通信オブジェクト)を派生したBasePortオブジェクトを持っています。 COMPortオブジェクトは、1つのTXThreadクラスとRXThreadクラスを作成します。これらのスレッドは、 "OVERLAP"が読み取りまたは書き込み操作がWaitForMultipleObjects()で終了したことを通知するのを待機しています。

TXThreadsは、TXWrite関数(メインプロセスとスレッド間のデータがトランセッシュセーフFIFOバッファを通過する)によって何も起こさずにスリープ状態になるとスリープ状態になります。

この場合、ポートが閉じたイベント信号を待つ必要があるため、実際には保留中の操作を取り消して終了できます(トレッドは終了して削除されます)。

USBポートがconnectd/disconnetedであるかどうかを検出するには、WindowsのメッセージDEVICE_CHANGEを待ち受けます。ポートが切断されている場合、私はイベントを設定し、ポートクラスを削除して閉じる前にスレッドが終了するのを待ちます。

このアプローチは非常に信頼性が高く安全です。それは私が8年以上前に設計した通信プラットフォームの中核であり、まだ蹴っています。

+0

私はこれが動作していると思います。ありがとう。 –

関連する問題