我如何在单获得串口的“友好”名称,并保持它的跨平台

问题描述:

我问这个问题:
Serial Port (rs232) in Mono for multiple platforms我如何在单获得串口的“友好”名称,并保持它的跨平台

而这一次是有关:
How do I get the friendly name of a COM port in Windows?

但我想能够在Windows上获得“友好”的名称 - 如果有这样的事情,也可能在linux/mac上。

有没有跨平台的方式去做,或者我运气不好?

这是我在当前的应用程序中所做的 - 它对原生C++ win32非常有用。

http://www.naughter.com/enumser.html

在任何情况下,它看起来并不像跨平台分发一个漂亮的解决方案。有没有人有什么建议?

编辑 - 由于人们无法理解我所要求的: 作为示例 - COM9不是一个友好的名字。我想要一些说“COM9 - USB连接器”或类似的东西。在Win32中可以使用上面的链接。这是令人讨厌和冒险的,但很多时候,最终用户不知道他们需要在我的程序中打开哪个COM端口,除非有一个有用的名称 - 比“COMn”更有用。

+0

那么,其他用户一定的编辑之后,我的文章的标题改为完全改变的问题。这不是我想到的。由于我不知道如何使用回滚功能,我想我也失去了一些很好的更改和编辑。 – Tim 2009-01-28 22:20:18

AFAIK在linux中COMM设备没有“友好”的名字。我建议你做的是在linux环境中使用/ dev/ttyS#作为你的设备名,并在Windows中将它们列为COMM#。

linux用户会理解术语,所以不应该担心。

+0

+1,一些USB串口可能有usbtty..some的名字 - 我会检查出来 – 2009-01-28 02:06:17

+0

Tanj是正确的 - 没有(标准的,至少)的方式来分配一个“名称”的串行端口设备在Linux中。你可以管理的最好的东西是/ dev /之后的设备部分 - 如果你找到你的意思的例子,尽一切办法给我们。 – Coderer 2009-01-30 20:13:43

+1

其实我不同意这个。 HAL实际上为Linux提供了“友好名称”,但我不知道它有任何Mono API。 – supercheetah 2009-06-04 07:36:12

考虑查看SerialPort.GetPortNames()静态方法。它在.NET 2.0中可用,它看起来也在Mono中实现。根据http://www.go-mono.com/docs/>单声道文档页面,单声道串口对象上存在GetPortNames,所以我会给它一个镜头。

如果它已经实现,它应该返回一个包含计算机上可用端口名称的C#数组字符串。这些应该对你拥有的任何底层操作系统有意义。例如,在Windows中,它将返回COM1,COM2,COM4等等。它应该返回PortName属性所需的字符串。

更新:

考虑看看a post from the mono-dev mailing list它看起来像它在* nix的环境下正常工作。

+2

这是我在上面的问题中链接到的问题的内容的重复。这根本没有帮助。 COM1不够​​有意义 - 正如我所说的,我希望通过其他方法获得更多“友好”信息,例如Windows上可用的信息(请参阅我的问题中的链接) – Tim 2009-01-28 22:16:21

你需要考虑做WMI。我一直无法自己运行,但如果您将this basic framework与如何检索WMI对象Win32_SerialPort类的this documentation相结合,我认为您可以解决一些问题。

基本上,您想获得系统上所有Win32_SerialPort的集合,然后遍历它们。您可能需要“标题”或“描述”,或者可能只是“名称”。我最好的建议是设置一个断点并在调试模式下检查对象的属性,这样你就可以确切地知道填充的内容。

代码:

public static ArrayList GetComFriendlyNames() 
    { 
     ArrayList names = new ArrayList(); 
     try 
     { 
      ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher("root\\WMI", 
       "SELECT InstanceName, PortName FROM MSSerial_PortName"); 

      foreach (ManagementObject port in searcher.Get()) 
      { 
       names.Add(port["PortName"] + " - " + port["InstanceName"]); 
      } 
     } 
     catch (ManagementException) 
     { 
     } 
     return names; 
    } 

用法:

 ArrayList ports = GetComFriendlyNames(); 
     foreach (string name in ports) 
     { 
      Console.WriteLine(name); 
     } 

示例输出:

COM1 - ACPI \ PNP0501 \ 1_0

COM2 - ACPI \ PNP0501 \ 2_0

COM3 - F ?TDIBUSVID_0000 + PID_0000 + 0 0 000_0

尝试在WMI以下查询:

“选择的名字从Win32_PnPEntity” 并搜索包含对象的 “COM”,例如,我有一个安装在我的计算机上的USB串口转换器装置:

USB60FPW USB串行转换器(COM6)