c# - USB Serial Port Unplugged 但仍在端口列表中

标签 c# serial-port

所以我有一个代码可以检测使用该方法插入的设备

SerialPort.GetPortNames();

无论如何,除了我打开一个现有端口(通过从列表中选择它)之外,一切正常

port = new SerialPort(portname, 9600);
port.Open();

然后如果设备被拔掉,它不会从列表中删除..我认为这是因为端口没有关闭..

但我不明白为什么如果我不手动关闭它,它仍然在列表中,即使设备已拔掉..

port.Close();

因为如果我打开一个不在列表中的端口,那么它就不会出现在列表中..

谁能给我解释一下这种行为?

最佳答案

这完全取决于模拟串行端口的 USB 设备驱动程序。在端口打开时拔掉它通常是一个非常糟糕的主意。有很多驱动程序会使端口消失,即使您的 SerialPort 对象在端口上打开了一个句柄。这往往会使生成 DataReceived、PinChanged 和 ErrorReceived 事件的工作线程崩溃。该异常不可捕获,因为它发生在工作线程上,终止了您的程序。有些驱动程序甚至会拒绝关闭端口的尝试,从而无法彻底结束您的程序。

听起来你有一个不错的驱动程序,只要你不调用 Close() 就可以使模拟端口保持事件状态。这是好事,不是问题。不要指望它能在你用户的机器上工作,你无法预测他们的设备会得到什么样的驱动程序。购买建议是个好主意。

长话短说,串口是非常原始的设备,可以追溯到计算的石器时代。它们没有即插即用支持,因此发生的事情是完全不可预测的。唯一明智的做法是永远不要在使用设备时拔下电缆。这并不难 :) 更多关于它在 this answer 中引起的麻烦的信息。 .

关于c# - USB Serial Port Unplugged 但仍在端口列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23243503/

相关文章:

c - 使用 C 初始化、读写 linux 串口设备

C++ 将串行输入读取到字符串

c# - 从 MySQL 数据库中检索图像并使用 C# 在网页上显示

c# - 从 C# 中的接口(interface)创建对象

c# - 使用 C# 从列表中删除最旧的 n 项

objective-c - 为什么在与 USB 转串行适配器通信时此串行通信代码会挂起?

c# - 拖放界面

c# - 检查当前日期时间是否在晚上 8 点到早上 8 点之间,并计算到早上 8 点之前剩余的总小时数

iPhone串口错误

serial-port - 使用 zmodem/picocom/minicom 非交互传输文件