SerialPort问题

260*_*986 8 c# usb serial-port

我正在使用SerialPort与条形码阅读器进行通信(只读).

我已经安装了驱动程序来操作阅读器,就好像它是通过Com-port连接的,虽然它是一个usb设备.插入设备后,列表中会再出现一个Com-port.

问题如下.我初始化SerialPort对象以从条形码阅读器读取,但如果读取器被拔掉,我无法正确完成或处置SerialPort对象,因为它"附加"的端口不再存在.

程序关闭时,结果是WinIOException.我不仅在使用SerialPort的代码中捕获它,而且在program.cs级别也是如此.根据堆栈,在尝试完成和处理SerialPort对象后抛出WinIOException.

我有什么想法可以正确操作这种情况吗?或者至少要抓住异常?

我确切知道的是问题不在于这个特定的驱动程序; 我还有一个来自其他制造商的条形码阅读器(具有相同目的的驱动程序) - 情况是一样的.

Han*_*ant 13

叹了口气,这是USB串口仿真器的老问题.串行端口是可以追溯到石器时代的设备.它们曾经被拧入公共汽车,当程序使用它时没有办法将它们移除而不会产生火花和滚滚浓烟.石器时代还包括缺少任何类型的即插即用支持,以便程序可以检测到该设备突然是奇闻趣事.

不幸的是,即使程序打开了端口,大多数模仿它们的坏设备驱动程序也只会使它们消失.当Windows向其中写入文件时,这与将插槽中的闪存驱动器冲出一样有效.有一个后台工作线程等待来自设备驱动程序的通知,以便它可以生成DataReceived,ErrorReceived和PinChanged事件.当设备突然消失时,该线程会遭受心脏病发作.你无法理解,它是一个由SerialPort类启动的线程,你不能用try/catch包装它.

根据大众的需求,微软在.NET 4.0中做了一些事情.实际上并不确定该版本中会发生什么.如果你被困在一个早期版本,你能做的唯一合理的事情就是带旁边的USB插槽的标志:"不要在使用中删除,而" 这不可避免地会让某人至少两次拔掉设备,看看会发生什么.之后他们对此感到厌倦,让你平静下来.

非常不合理的解决方法是带有以下内容的app.exe.config文件:

<?xml version ="1.0"?>
<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

不要使用它.

  • 不,它没有固定在4.0(或4.5来),你只能通过"忽略"它(以及来自其他来源的任何其他类似的例外)来终止异常终止应用程序. (3认同)

小智 5

在我的代码中,这发生Finalize()在BaseStream上的方法的一部分,由垃圾收集器调用.

因此,如果继承.NET SerialPort类并覆盖打开/关闭,则可以执行以下操作:

在公开赛期间,只需打电话 GC.SuppressFinalize(Me.BaseStream)

在收盘时,尝试打电话 GC.ReRegisterForFinalize(Me.BaseStream)

如果已经拔出USB,这将引发异常,抱怨访问BaseStream.要么.IsOpen在调用之前检查属性GC,要么将其包装在a中,Try Catch如果你不信任.IsOpen每次都返回False ...

这将解决它,你的应用程序将处理它被拉出的事实,并且当你关闭时它不会崩溃.

我目前无法制作它然后重新打开端口,如果它重新插入,但至少有一些进展超出标签说不要触摸......