所以我有一个代码来检测插入该方法的设备
SerialPort.GetPortNames();
Run Code Online (Sandbox Code Playgroud)
无论如何,一切正常,除非我打开现有端口(从列表中选择它)
port = new SerialPort(portname, 9600);
port.Open();
Run Code Online (Sandbox Code Playgroud)
然后,如果设备被拔掉,它不会从列表中删除..我认为这是因为端口没有关闭..
但我无法弄清楚为什么它仍然在列表中如果我不手动关闭它,即使设备已拔下插头..
port.Close();
Run Code Online (Sandbox Code Playgroud)
因为如果我打开一个不在列表中的端口,它就不会出现在列表中.
谁能解释我这种行为?
完全取决于模拟串行端口的USB设备驱动程序.在端口打开时拔出端口通常是一个非常糟糕的主意.即使您的SerialPort对象在端口上打开了句柄,也有很多驱动程序使端口消失.这往往会导致生成DataReceived,PinChanged和ErrorReceived事件的工作线程崩溃.该异常不可捕获,因为它发生在工作线程上,终止您的程序.有些司机甚至拒绝尝试关闭端口,因此无法干净地结束您的程序.
听起来你有一个像样的驱动程序,只要你不调用Close()就可以使模拟端口保持活动状态.那是件好事,不是问题.不要指望在用户的机器上工作,你无法预测他们的设备会得到什么样的驱动程序.购买建议是一个好主意.
长话短说,串口是非常原始的设备,可以追溯到计算的石器时代.它们没有即插即用的支持,所以发生的事情是完全不可预测的.只有理智的事情是在设备使用时永远不要拔掉电缆.这不难做:)更多关于它在这个答案中引起的麻烦.
归档时间: |
|
查看次数: |
2416 次 |
最近记录: |