USB デバイスのアタッチ イベントとデタッチ イベントを検出するために、この(リンク) ライブラリを使用しています。適切なデバイスが接続されていることを検出した後 (特定の VID/PID の組み合わせで識別)、シリアル ポート接続を開き、同様に、デバイスが取り外されたときにシリアル ポート接続を閉じます。
私の接続イベントはうまく機能し、最後に使用できるシリアル ポートを取得しますが、接続解除イベント内で問題が発生します。デタッチ イベントは正しく発生しますが、コードの実行がcloseCOM(serialPort1)
ポイントに達すると、オーバーライド ループにジャンプし、以降wndProc
の実行を防ぎ closeCOM()
ます。
ライブラリWndProc
にはイベントを検出するためのメッセージが必要で、私のコードは次のように実装されています。
//Catch Windows messages and pass them to the USBClass class
protected override void WndProc(ref Message m)
{
USBPort.ProcessWindowsMessage(ref m);
base.WndProc(ref m);
}
次に、次のコードを実行する detach イベントがあります。
if (!USBClass.GetUSBDevice(VID, PID, ref USBDeviceProperties, false) && USBDeviceConnected)
{
//Device is removed
USBDeviceConnected = false;
//Close COM port just in case we forgot to disconnect
closeCOM(serialPort1);
//update status strip
strip_device_status.Text = "Disconnected";
}
そしてここにcloseCOM
関数があります:
//This function handles COM port closing.
private void closeCOM(SerialPort port)
{
// If a serial port is open, disconnect it
if (port.IsOpen)
{
// close the serial port
port.Close();
}
//update com port status flag
COMConnected = false;
//update status strip
strip_COM_status.Text = "Disconnected";
}
特に、この「競合」を引き起こしているのはcloseCOM()
、その行をコメントアウトすると、後でエラーを引き起こす可能性のある開いたシリアルポートが残っていることを除いて、すべてが機能するためです。コードWndProc
が通常の実行ではなくオーバーライドにジャンプする原因は何ですか? デタッチ イベントでポート クローズを実行できるようにしたいと考えています。