我如何在单获得串口的“友好”名称,并保持它的跨平台
-
22-07-2019 - |
题
我问这个问题:点击 串行端口(RS-232)在单声道多平台
和这一个相关:结果 如何获得友好在Windows中的COM端口的名称?
不过,我希望能够得到关于Windows的“友好”名称,也可能在Linux / MAC,如果有这样的事情。
有没有跨平台的方式做到这一点,还是我的运气?
下面是我在我的当前应用程序正在做的 - 和它的伟大工程的本地C ++的win32。
http://www.naughter.com/enumser.html
在任何情况下,它不象跨平台分布的相当溶液。有没有人有什么建议吗?
编辑 - 因为每个人都无法理解什么,我要求: 作为一个例子 - COM9不是一个好记的名称。我想要的东西,说:“COM9 - USB连接器”或类似的东西。这是可能与上述在Win32中的链接。这是肮脏和哈克,但很多时候,最终用户不知道他们需要的,除非有一个有用的名字在我的程序开什么COM端口 - “共同事业”比更有益
解决方案
AFAIK存在用于在Linux中COMM设备没有“友好”的名称。我建议你做的是使用在/ dev / TTYS#为您的设备名称在Linux环境中,并列出它们在Windows COMM#。
在linux用户将理解的术语,以便不应该有一个担心那里。
其他提示
考虑在看SerialPort.GetPortNames()
静态方法。它在.NET 2.0中可用,而且它看起来像它在Mono的实施也是如此。据http://www.go-mono.com/docs/>the单文档页面,GetPortNames存在单串口对象,所以我给它一个镜头。
如果它的实现,它应该返回您包含端口名称您的计算机上的字符串的C#阵列。这些应该让你感觉有什么底层的操作系统。例如,在Windows中,它会返回COM1,COM2,COM4,等等。它应该返回所需PortName
属性的字符串。
更新
以看看从交单-dev邮件列表的,它看起来像它在* nix的环境下正常工作。
尝试以下查询在WMI:
“选择的名字从Win32_PnPEntity”,并搜索包含“COM”对象,例如,我已经安装在计算机上的USB串口转换器装置:
USB60FPW USB串行转换器(COM6)
您需要寻找到做WMI。我一直没能到这个运行自己,但如果结合这个基本框架如何检索与此WMI对象在Win32_SerialPort
类的文档,我想你可以想些办法。
基本上,你想在系统上的所有Win32_SerialPort
s的集合,然后遍历它们。您可能要在“标题”或“说明”,或者只是“名”。我最好的建议是只设置一个断点,并在调试模式下检查对象的属性,以便你能弄清楚到底是什么被填充。
代码:
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 - ?FTDIBUSVID_0000 + PID_0000 + 0 0000000&0&0 000_0