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)
不要使用它.
小智 5
在我的代码中,这发生Finalize()在BaseStream上的方法的一部分,由垃圾收集器调用.
因此,如果继承.NET SerialPort类并覆盖打开/关闭,则可以执行以下操作:
在公开赛期间,只需打电话 GC.SuppressFinalize(Me.BaseStream)
在收盘时,尝试打电话 GC.ReRegisterForFinalize(Me.BaseStream)
如果已经拔出USB,这将引发异常,抱怨访问BaseStream.要么.IsOpen在调用之前检查属性GC,要么将其包装在a中,Try Catch如果你不信任.IsOpen每次都返回False ...
这将解决它,你的应用程序将处理它被拉出的事实,并且当你关闭时它不会崩溃.
我目前无法制作它然后重新打开端口,如果它重新插入,但至少有一些进展超出标签说不要触摸......
| 归档时间: |
|
| 查看次数: |
12983 次 |
| 最近记录: |