SerialPort.GetPortNames()返回错误的端口名称

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

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

事实certificate,函数SerialPort.GetPortNames()返回错误的端口名称,并在端口名称后添加“奇怪”字符。 例如:

  • COM3吀
  • COM3䡢
  • COM3゠

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

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

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

  txtLog.Text += Msg + Environment.NewLine; 

这适用于所有其他Windows版本。 我已经检查了注册表,所有看起来都很好。 有人对此有所了解吗?

我怀疑.NET Framework 2.0不再是100%兼容的,虽然你可以在Windowsfunction中启用它,但似乎程序本身运行正常(除了我的串口问题)。 我有点害怕升级到更新的.NET,更不用说我们使用VisualStudio 2008 for c#(max = .NET 3.5)。 请注意,程序仍然需要在Windows XP上运行(POS版本仍由Microsoft维护)。

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

增加2:安装了VisualStudio 2015,并使用不同的.NET框架版本进行了多次构建。 v2.0和3.5仍然添加了奇怪的字符。 但是在v4.0及以上这个问题似乎已经解决了! 现在,为原始程序编译并为更新的Framework工作。 但是我发现这个问题非常奇怪,并且预计这将会影响更多.NET函数和更多程序。

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

 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 

我遇到了与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 beta错误报告工具向Microsoft报告了此情况。 也许有一天会有一个修复。

如您所说,启用Windowsfunction后程序可以正常工作:

Windows 8 / 8.1 / 10上默认不启用.NET 2.0,3.0,3.5。 这些文件不存储在安装介质/ wim上。

可以使用Windows更新中的DISM命令或本地源启用它。

 DISM /Online /Enable-Feature /FeatureName:NetFx3 /All 

看看这个: 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 \ SERIALC OMM”
  3. 记下通信端口名称。
  4. 在通讯端口名称后附加“0”或任何字符。
  5. 将通讯端口名称更改回第3步中的名称。

它对我有用。 博德之门

 string[] ports = SerialPort.GetPortNames(); for (int i = 0; i= 0x30) & ((mystr[mystr.Length-1]) <= 0x39)) { } else { mystr = mystr.Remove(mystr.Length-1); } ports[i] = mystr; }