如何在Mono中获得串口的“友好”名称并使其保持跨平台

时间:2009-01-13 05:09:03

标签: .net linux mono cross-platform serial-port

我问了这个问题:
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中的上述链接实现。这是令人讨厌和hacky,但很多时候最终用户不知道他们需要在我的程序中打开什么COM端口,除非有一个有用的名称 - 比“COMn”更有用。

6 个答案:

答案 0 :(得分:4)

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

linux用户将理解术语,因此不必担心。

答案 1 :(得分:2)

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

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

更新

看一下a post from the mono-dev mailing list它看起来好像在* nix环境下工作。

答案 2 :(得分:0)

在WMI中尝试以下查询:

“从Win32_PnPEntity中选择名称”并搜索包含“COM”的对象,例如,我的计算机上安装了USB-Serial Converter设备:

USB60FPW USB串行转换器(COM6)

答案 3 :(得分:0)

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

https://github.com/kcwongjoe/serial_port

std::vector<SerialPortInfo> comPorts = SerialPort::getSerialPortList();
std::cout << comPorts[0].friendlyName << std::endl;

答案 4 :(得分:-2)

你需要研究做WMI。我自己无法运行,但是如果你结合this basic framework如何使用Win32_SerialPortthis documentation检索WMI对象,我想你可以解决一些问题。

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

答案 5 :(得分:-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&amp; 0000000&amp; 0&amp; 0?000_0