在C#2008应用程序中,我使用SerialPort.GetPortNames()函数检索当前可用端口的列表。我注意到的是,每当我插入USB设备时,它的端口号就会显示在我的应用程序的列表中,而当我拔出它并刷新列表时,该端口号就不再存在。

应用程序的一个阶段涉及连续从设备读取数据/向设备写入数据。现在,我的期望是,如果我在操作过程中拔出设备并使用SerialPort.GetPortNames()获取当前的端口列表,则端口名将不存在,我可以用它来确定设备已拔出。

令我惊讶的是,尽管删除了端口名

为什么程序会这样?在无通信模式下,未列出端口名称。它与通信时被卸下的设备有关吗?

最佳答案

我假设您的意思是System.IO.Ports.SerialPort.GetPortNames(),因为我在任何地方都找不到GetPortList()函数。 MSDN说:“如果注册表包含陈旧或不正确的数据,则GetPortNames方法将返回不正确的数据”,因此可能是问题所在。我想如果端口仍在“使用”中,Windows不会更新注册表,就像程序上有句柄时无法删除文件一样。

如果要测试设备是否已卸下,可以通过Window API调用(http://www.pinvoke.net/default.aspx/user32/RegisterDeviceNotification.html)进行。希望有帮助!

10-05 23:50