代码之家  ›  专栏  ›  技术社区  ›  msoft

串行端口。GetPortNames()返回错误的端口名

  •  9
  • msoft  · 技术社区  · 9 年前

    虽然c#不是我的主要编程语言,但我现在已经维护这样的程序几年了。此程序通过串行端口连接到设备,可从Windows XP到8.1运行。一个特定的“功能”是它使用.NET Framework 2.0。

    随着一些用户升级到Windows 10,我们收到了程序无法检测/打开设备的COM端口的投诉。我们已经在自己的测试系统上确认了这一点,并安装了干净的Win10。

    结果是函数SerialPort。GetPortNames()返回错误的端口名,并在端口名后添加“奇怪”字符。 例如:

    • 通信3
    • 通信3
    • 通信3

    等等。当我刷新列表时,每次数字后面出现另一个字符(或两个)。 测试代码非常简单:

      string[] portNames = System.IO.Ports.SerialPort.GetPortNames();
      log("Available ports:");
      foreach (string PortAvailable in portNames)
      {
        log(PortAvailable);
      }
    

    其中log函数会在表单上的标准TextBox中添加一行:

      txtLog.Text += Msg + Environment.NewLine;
    

    这适用于其他所有Windows版本。 我检查了注册表,那里看起来也很好。 有人知道吗?

    我怀疑.NET Framework 2.0不再100%兼容,尽管您可以在Windows功能中启用它,而且程序本身运行良好(除了串行端口问题)。我有点害怕升级到更新的.NET,更不用说我们为c#(max=.NET3.5)提供了VisualStudio2008。请注意,该程序仍然需要在Windows XP上运行(POS版本仍然由Microsoft维护)。

    补充: 我已经将一个测试程序“升级”到.NET 3.5,但仍然存在完全相同的问题。 下一步是安装一个新的VisualStudio(它现在似乎是免费的??我是否也应该检查Studio中的隐私设置?;-)。

    添加2: 安装了VisualStudio 2015,并使用不同的.NET framework版本进行了多个生成。v2.0和3.5仍然添加了奇怪的字符。但在v4.0及更高版本中,这个问题似乎得到了解决!现在来编译原始程序,并为新的框架工作。 但我发现这个问题非常奇怪,并预计这会影响更多的.NET函数和程序。

    5 回复  |  直到 9 年前
        1
  •  7
  •   Bob Aune    9 年前

    我也见过奇怪的角色。我的解决方案是使用正则表达式过滤掉通信端口名的数字部分。

    Dim ports As New Devices.Ports
    For Each s As String In ports.SerialPortNames
        s = Regex.Replace(s, "\D*(\d+)\D*", "$1")
        Debug.WriteLine(s)
    Next
    
        2
  •  3
  •   sstteevvee    9 年前

    我在USB CDC串行设备上遇到了完全相同的问题,由新重写的Windows 10 usbser处理。sys驱动程序。

    垃圾字符通常是数字,因此删除非数字不是解决问题的可靠方法。对于我的解决方案,请看我在这篇文章中的最后一篇文章:

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/a78b4668-ebb6-46aa-9985-ec41667abdde/ioportsserialportgetportnames-registrykeygetvalue-corruption-with-usbsersys-driver-on-windows?forum=netfxbcl

    ..有一些代码将通过注册表,找到usbser端口,并返回它们未对齐的名称。当心它不会回来 全部的 串行端口,仅由该驱动程序提供的端口。该代码适用于Windows XP至10。

    根本的问题是usbser。sys驱动程序创建一个注册表项,在.NET(至少3.5)上,GetPortNames()函数尝试读取这些注册表项并获取损坏的数据。我已经通过该论坛(假设他们阅读了)和内置的Windows 10测试版错误报告工具向微软报告了这一情况。也许有一天会有解决办法。

        3
  •  1
  •   yobbo    9 年前

    正如您所说,该程序在启用windows功能后工作:

    默认情况下,Windows 8/8.1/10上未启用.NET 2.0、3.0、3.5。这些文件不会存储在安装媒体/wim上。

    可以从windows update或本地源使用DISM命令启用它。

    DISM /Online /Enable-Feature /FeatureName:NetFx3 /All
    
        4
  •  1
  •   Baldur Thorgilsson    9 年前

    看看这个: http://forums.radioreference.com/uniden-tech-support/317887-windows-10-uniden-usb-driver-5.html 对于修复Win 10串行端口因端口名后的奇怪字符而无法工作的解决方案。

    1. 使用regedit.exe进入注册表。
    2. 导航到“HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SSERIALC OMM”
    3. 记下通信端口名称。
    4. 将“0”或任何字符附加到通信端口名。
    5. 将通信端口名称更改回步骤3中的名称。

    这对我有用。 巴尔杜尔

        5
  •  0
  •   Jakub    9 年前
    string[] ports = SerialPort.GetPortNames();
    
            for (int i = 0; i<ports.Length;i++)
            {
                string mystr = ports[i];
                if (((mystr[mystr.Length-1]) >= 0x30) & ((mystr[mystr.Length-1]) <= 0x39))
                {
    
                }
                else
                {
                    mystr = mystr.Remove(mystr.Length-1);
                }
                ports[i] = mystr;
            }