所以我有一个代码可以检测使用该方法插入的设备
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/