Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SerialPort.GetPortNames()返回不正确的端口名_C#_.net 2.0_Windows 10 - Fatal编程技术网

C# SerialPort.GetPortNames()返回不正确的端口名

C# SerialPort.GetPortNames()返回不正确的端口名,c#,.net-2.0,windows-10,C#,.net 2.0,Windows 10,虽然c#不是我的主要编程语言,但我现在要维护这样一个程序好几年了。此程序通过串行端口连接到设备,可从Windows XP运行到8.1。一个特定的“特性”是它使用.NETFramework2.0 随着一些用户升级到Windows 10,我们收到一些投诉,称程序无法检测/打开设备的COM端口。我们已经在安装了干净的Win10的测试系统上确认了这一点 结果表明,函数SerialPort.GetPortNames()返回不正确的端口名,并在端口名后添加“奇怪”字符。 例如: COM3吀 COM3䡢 C

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

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

结果表明,函数SerialPort.GetPortNames()返回不正确的端口名,并在端口名后添加“奇怪”字符。 例如:

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

  string[] portNames = System.IO.Ports.SerialPort.GetPortNames();
  log("Available ports:");
  foreach (string PortAvailable in portNames)
  {
    log(PortAvailable);
  }
其中,log函数向表单上的标准文本框添加一行:

  txtLog.Text += Msg + Environment.NewLine;
这适用于所有其他Windows版本。 我检查了注册表,那里看起来也很好。 有人对此有想法吗

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

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

增加2: 安装了VisualStudio 2015,并使用不同的.NET framework版本进行了多个构建。v2.0和3.5仍然添加了奇怪的字符。但在v4.0及以上版本中,这个问题似乎无法解决!现在开始编译原始程序,并为新的框架工作。
但是我觉得这个问题很奇怪,我希望这会影响更多的.NET功能和更多的程序。

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

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

可以使用windows update或本地源中的DISM命令启用它

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

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

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
看看这个: 为解决Win 10串口因端口名后出现奇怪字符而无法工作的问题,请参阅

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
  • 使用regedit.exe进入注册表
  • 导航到“HKEY\U LOCAL\U MACHINE\HARDWARE\DEVICEMAP\SERIALC OMM”
  • 记下通信端口名
  • 将“0”或任何字符附加到通信端口名
  • 将通信端口名称更改回步骤3中的名称
  • 这对我有用。 Baldur

    string[]port=SerialPort.GetPortNames();
    
    对于(int i=0;i=0x30)和((mystr[mystr.Length-1])我在USB CDC串行设备上遇到了完全相同的问题,由新重写的Windows 10 usbser.sys驱动程序处理

    垃圾字符通常是数字,因此删除非数字并不是解决此问题的可靠方法。有关我的解决方案,请参阅我在此线程上的最后一篇文章:

    …那里有一些代码将通过注册表查找usbser端口,并返回其未混合的名称。请注意,它不会返回所有串行端口,只返回该驱动程序提供的端口。这些代码在Windows XP上工作到10


    潜在的问题是usbser.sys驱动程序创建了一个注册表项,而在.NET(至少3.5版本)上,GetPortNames()函数试图读取这些注册表项并获取损坏的数据。我已经通过该论坛向Microsoft报告了这一点(假设他们读取了)使用内置的Windows 10 beta错误报告工具。也许有一天会有一个修复程序。

    不,不是这样。没有.NET 2.0,程序根本无法运行,这是显而易见的。安装程序根本不允许我们安装它。使用.NET 2.0,函数返回错误值,如问题中所示。感谢您的确认。因此这确实是Microsoft的一个错误,我很好奇其他的.NET函数有什么类似的问题。这里真正的解决方法是他们解决这个问题,但我们不要等待。虽然使用.NET Framework 4可能是最好的解决方案,但我们选择了过滤端口名。这样我们仍然可以为Windows XP用户服务,而且我们不必测试端口名我将根据新的.NET版本详细介绍软件。因此,我将此答案设置为我们的解决方案。随机垃圾字符通常是另一个数字,因此,尽管此正则表达式在大部分情况下都能满足您的要求,但它并不完全可靠。感谢您的输入,对于具有少量注册表经验的最终用户来说,它确实是一个解决方案(大多数stackoverflow访问者可能都是;-)。但作为软件供应商,我们不能要求我们的用户修改他们的设置。我还假设在插入新设备(或有时使用另一个端口)时会暂时中断再次提供损坏的端口名。MS应该修复此问题,但目前公认的解决方案已经在现场得到了验证。我认为是时候升级到.net 4了,真的,也是时候停止对winxp的支持了,不要是那个仍在运行win3.1的公司……如果客户运行的是7,则强制客户升级?好的,但是xp?今天?而且,你不必强迫他们,只需为.net 4安装程序提供你的下一个更新。我们说的是零售商,他们使用的是微软仍然支持的Windows xp POS。而且一些人当前的软件甚至可能不会在更新的Windows版本上运行。因为我们只为他们的系统提供了一个小的补充,所以我们不能不要强迫任何人:-(…如果MS在