SerialPort.GetPortNames 不一致时设备在运行过程中断开连接可以通过关闭使用它的应用程序来解决

问题描述

  1. SerialPort.GetPortNames() is wrong
  2. SerialPort.GetPortNames() behavior

我遇到了与上面链接 2 中的问题中描述的情况相同的情况,如果我在设备仍在使用(端口打开)时断开设备连接,它仍然会出现在 SerialPort.GetPortNames 的数组中 直到我关闭打开端口的应用程序

我怎么知道这个?
我一直在观察注册表编辑器 (HKLM\Hardware\DeviceMap\SerialComm) 中的更改,同时在设备使用时断开设备连接,我注意到当我关闭/终止/终止应用程序时,错误端口将在此之后立即删除。这使我得出结论,问题不在于操作系统,而在于我的应用程序。

我做了什么来解决这个问题?
我试图关闭端口,处置端口,将端口的变量设置为 null,然后调用垃圾收集器。这些似乎都不起作用。

如果我认为不一致是由我的应用程序引起的假设是正确的,那么我想知道是否可以(强行)重置应用程序的内部状态而不关闭它。

PS:我一直在玩连接/断开连接,我注意到我可以让它在注册表中显示一个端口(例如 COM5)多次(作为多行)编辑。当我终止应用程序时,它们都会消失。

解决方法

请分享您正在调用/执行的操作的相关代码,因为我没有得到相同的行为。你描述的不是它的工作原理,这让我相信你的代码有问题。另外,为什么您没有先正确关闭连接就断开设备连接(这对您的 PC 来说真的很糟糕)。

我创建了一个带有按钮的新表单,按下按钮会调用 GetPortNames 并将每个表单写入控制台。你可以从我的结果中看到我有一个 COM36。如果我从 PC 上移除该设备(通过 USB 拔下它)并再次按下按钮,COM36 将不再显示。 请注意,我在 COM36 上打开了一个超级终端连接。

private void button1_Click(object sender,EventArgs e)
{
    string[] theSerialPortNames = System.IO.Ports.SerialPort.GetPortNames();

    foreach (string s in theSerialPortNames)
    {
        Console.WriteLine(s);
    }
}

第一次按下按钮:

COM3 
COM1 
COM5 
COM33 
COM36

第二次按下按钮(物理拔下串行设备):

COM3
COM1
COM5
COM33

另见https://stackoverflow.com/a/2755035/2009197他很好地回答了这个问题。