c# - 串口问题

标签 c# usb serial-port

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

我已经安装了驱动程序来与读卡器一起操作,就好像它是通过 Com 端口连接的一样,尽管它是一个 USB 设备。插入设备后,列表中会出现一个 Com 端口。

问题如下。我将 SerialPort 对象初始化为从条形码阅读器读取,但如果拔下阅读器,我无法正确完成或处置 SerialPort 对象,因为它“连接”的端口不再存在。

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

我有什么想法可以正确处理这种情况吗?或者至少捕获异常?

我可以肯定的是,问题不在这个特定的驱动程序中;我还有一个来自另一家制造商的条形码阅读器(具有相同用途的驱动程序)- 情况是一样的。

最佳答案

唉,这是 USB 串行端口仿真器的一个老问题。串口是石器时代的设备。它们过去常常被拧到总线上,当程序正在使用它们时,没有办法在不产生 Spark 和滚滚浓烟的情况下将它们移除。石器时代还包括缺乏任何类型的即插即用支持,因此程序可以检测到该设备突然变得奇闻趣事。

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

应大众需求,Microsoft 在 .NET 4.0 中对此做了一些处理。实际上不确定该版本中会发生什么。如果您坚持使用较早的版本,唯一合理的做法就是在 USB 插槽旁边贴上一个标志:“请勿在使用时移除!”这不可避免地会让某人至少拔掉设备两次,看看会发生什么。之后他们对此感到厌倦,然后让您平静下来。

非常不合理的解决方法是一个包含以下内容的 app.exe.config 文件:

<?xml version ="1.0"?>
<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
  </runtime>
</configuration>

不要使用它。

关于c# - 串口问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3230311/

相关文章:

c# - 如何从网页中获取文本?

c# - 对象和类通信

同时监听/响应 HTTP 请求、串行端口和基于时间的事件的 Python 脚本?

c++ - 使用 Windows API 操作 RS 端口

c - 串口卡在 close() 上

c# - 如何从剪贴板中获取正确编码的 HTML?

c# - ASP.NET 核心 : [FromQuery] usage and URL format

macos - 从 Docker 容器访问托管在 OS X 上的 USB 网络摄像头

python - 连接到 nxt 砖时出错

linux - Yocto USB 电源管理的问题