【发布时间】:2012-04-07 19:36:41
【问题描述】:
我在使用 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;
如果我在通过“SerialPort”类打开 USB 设备时拔下它,我将无法正确关闭软件,并且虚拟端口永远保持打开状态,或者直到我重新启动整个计算机。
所以我的问题是,在我通过 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();
}
我已经覆盖了“SerialPort”类的 Dispose 事件,这样它就会中止线程:
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
this._deviceAvailableThread.Abort();
}
base.Dispose(isDisposing);
}
【问题讨论】:
-
拔掉设备后,你尝试关闭串口是怎么回事?
-
拔下设备后,我将中止所有线程,这些线程以任何方式属于设备;我关闭了 SerialPort 本身(它不会引发错误)并且我正在处理对象
-
用更多代码编辑问题
-
那个 dispose 覆盖看起来有点没必要。您是否在线程内永久运行某些东西以使其保持活力?当一个线程“代码用完”时,它会自行关闭。
-
什么时候一切都冻结了? CheckUsbDeviceAvailability, BarcodeScannerDeviceNotAvailableEvent 是在拔掉设备后调用的?
标签: c# serial-port usb barcode