4

我问了这个问题:
Serial Port (rs232) in Mono for multiple platform

这一个是相关的:
如何在 Windows 中获取 COM 端口的友好名称?

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

有没有跨平台的方法可以做到这一点,还是我不走运?

这是我在当前应用程序中所做的 - 它适用于本机 C++ win32。

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

无论如何,它看起来不像是跨平台分发的完美解决方案。有没有人有什么建议?

编辑 - 因为人们无法理解我的要求:例如 - COM9 不是一个友好的名称。我想要一些写着“COM9 -​​ USB 连接器”之类的东西。这可以通过上面的 Win32 链接实现。这很讨厌而且很麻烦,但是很多时候最终用户不知道他们需要在我的程序中打开哪个 COM 端口,除非有一个有用的名称——比“COMn”更有用。

4

6 回答 6

3

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

linux 用户会理解这些术语,因此不必担心。

于 2009-01-28T01:33:30.040 回答
2

考虑查看SerialPort.GetPortNames()静态方法。它在 .NET 2.0 中可用,而且看起来它也在 Mono 中实现。根据http://www.go-mono.com/docs/>的mono docs页面,GetPortNames存在于Mono串口对象上,所以我试一试。

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

更新:

查看来自 mono-dev 邮件列表的帖子,它看起来确实在 *nix 环境下工作。

于 2009-01-28T17:36:56.773 回答
0

在 WMI 中尝试以下查询:

“Select Name From Win32_PnPEntity”并搜索包含“COM”的对象,例如我的电脑上安装了一个USB-Serial Converter设备:

USB60FPW USB-串口转换器 (COM6)

于 2009-06-03T20:14:30.470 回答
0

我建立了一个用于串口控制的库。它可以从注册表中搜索友好名称。

https://github.com/kcwongjoe/serial_port

std::vector<SerialPortInfo> comPorts = SerialPort::getSerialPortList();
std::cout << comPorts[0].friendlyName << std::endl;
于 2020-11-24T06:08:57.097 回答
-2

代码:

    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

于 2009-02-27T17:26:00.343 回答
-3

你需要考虑做WMI。我自己无法运行它,但是如果您将如何检索 WMI 对象的这个基本框架与该类的文档Win32_SerialPort结合起来,我认为您可以解决一些问题。

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

于 2009-01-29T21:14:10.353 回答