0

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が通常の実行ではなくオーバーライドにジャンプする原因は何ですか? デタッチ イベントでポート クローズを実行できるようにしたいと考えています。

4

0 に答える 0