Освобождение отключенного виртуального последовательного порта

У меня возникла небольшая проблема с USB-сканером штрих-кода. . Я использую сканер с классом «SerialPort»:

        this._barcodeScanner = new SerialPort(comPort, 9600, Parity.None, 8, StopBits.One) { Handshake = Handshake.None, ReadTimeout = 500, WriteTimeout = 500 };
        this._barcodeScanner.Open();
        this._barcodeScanner.DataReceived += BarcodeScannerCallback;

Если я отключу USB-устройство, когда оно открыто с помощью класса «SerialPort», я не смогу правильно закрыть программу, и виртуальный порт останется открытым навсегда. или пока я не перезагружу весь компьютер.

Итак, мой вопрос: есть ли способ закрыть виртуальный порт после того, как я отключил устройство с помощью кода C#?

Приветствия

[изменить #1]

Хорошо, еще немного кода:

Таким образом, я проверяю каждые 10 секунд, подключено ли устройство:

    private bool CheckUsbDeviceAvailability()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI",
        "SELECT * FROM MSSerial_PortName WHERE PortName = '" + this.PortName + "'");

        if (searcher.Get().Count > 0)
            return true;
        return false;
    }

Это событие обратного вызова последовательного порта:

void BarcodeScannerCallback(object sender, SerialDataReceivedEventArgs e)
    {
        Thread.Sleep(500);
        string data = this._barcodeScanner.ReadExisting().Replace(Convert.ToChar(2), Convert.ToChar(32)).Trim();
        if (data.StartsWith("AX"))
        {
            string[] arrData = data.Split('\n');
            this._barcodeScanner.StopAvailabilityThread();
            Barcode code = new Barcode(arrData[0].Replace("\r", ""));

            if (CheckIfBarcodeExists(code))
                this.UpdateBarcodeNode(code);
            else
                this.CreateBarcodeNode(code);

            BarcodeScannerCallbackEvent(sender, e, code);
            this._barcodeScanner.StartAvailabilityThread();
        }

        this._barcodeScanner.ComDevicePluggedIn = ScannerDevice.ComAvailabilityState.Available;
    }

если он больше не отвечает, он запустит «DeviceNotAvailableEvent()»:

    void BarcodeScannerDeviceNotAvailableEvent()
    {
        this._barcodeScanner.Close();
        this._barcodeScanner.Dispose();
    }

Я переопределил событие Dispose класса «SerialPort», чтобы он прервал поток:

protected override void Dispose(bool isDisposing)
    {
        if (isDisposing)
        {
            this._deviceAvailableThread.Abort();

        }

        base.Dispose(isDisposing);
    }
9
задан MPelletier 26 September 2013 в 02:10
поделиться