我如何在单获得串口的“友好”名称,并保持它的跨平台
我问这个问题:
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”更有用。
AFAIK在linux中COMM设备没有“友好”的名字。我建议你做的是在linux环境中使用/ dev/ttyS#作为你的设备名,并在Windows中将它们列为COMM#。
linux用户会理解术语,所以不应该担心。
+1,一些USB串口可能有usbtty..some的名字 - 我会检查出来 – 2009-01-28 02:06:17
Tanj是正确的 - 没有(标准的,至少)的方式来分配一个“名称”的串行端口设备在Linux中。你可以管理的最好的东西是/ dev /之后的设备部分 - 如果你找到你的意思的例子,尽一切办法给我们。 – Coderer 2009-01-30 20:13:43
其实我不同意这个。 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的环境下正常工作。
这是我在上面的问题中链接到的问题的内容的重复。这根本没有帮助。 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)
那么,其他用户一定的编辑之后,我的文章的标题改为完全改变的问题。这不是我想到的。由于我不知道如何使用回滚功能,我想我也失去了一些很好的更改和编辑。 – Tim 2009-01-28 22:20:18