Tengo un pequeño problema con un escáner de código de barras USB. Estoy utilizando el escáner con la clase "SerialPort":Liberación de un puerto serie virtual desconectado
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;
Si desconecto el dispositivo USB mientras it abrieron a través de la clase "SerialPort", no puedo cerrar el software correctamente y el puerto virtual permanece abierto por toda la eternidad o hasta que reinicie toda la computadora.
Así que mi pregunta es, ¿hay alguna forma de cerrar el puerto virtual después de desconectar el dispositivo a través del código C#?
Saludos
[editar # 1]
Alrighty, algo más de código:
De esta manera estoy comprobando cada 10 segundos si el dispositivo está enchufado:
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;
}
Ese es el evento de devolución de llamada del puerto serie:
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;
}
si es imposible responder más que se disparará el "DeviceNotAvailableEvent()":
void BarcodeScannerDeviceNotAvailableEvent()
{
this._barcodeScanner.Close();
this._barcodeScanner.Dispose();
}
He imponerse a la dirección de eventos Disponer de la clase "SerialPort" para que se inunda va a abortar el hilo:
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
this._deviceAvailableThread.Abort();
}
base.Dispose(isDisposing);
}
¿Qué intenta cerrar el puerto serie cuando el dispositivo se ha desconectado? –
Cuando el dispositivo está desenchufado, estoy abortando todos los hilos, que pertenecen de alguna manera al dispositivo; Cierro el SerialPort mismo (que no arroja un error) y estoy desechando el objeto –
¿se puede mostrar más código? – Reniuz