0

我正在尝试编写一个使用 arduino mega 和基于 FTDI 的 USB 到 RS485 适配器的程序。

我想让程序对用户友好,因此我不会让用户手动检查 com 端口号,但我想自动检测它。这是代码片段

    ManagementScope scope = new ManagementScope();
    SelectQuery query = new SelectQuery("SELECT * FROM Win32_SerialPort");
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

    try
    {
        foreach (ManagementObject item in searcher.Get())
        {
            String description = item["Description"].ToString();
            String deviceID = item["DeviceID"].ToString();

            Console.WriteLine("Porta " + description + " deviceID " + deviceID);

            if (description.Contains("USB Serial Port"))
                return deviceID;
        }
    }
    catch (ManagementException)
    {
    }

我无法理解的一点是为什么我可以找到 Arduino 的 USB Serial 端口(匹配description.Contains("Arduino"))但找不到 USB RS485 端口的 com 端口。

你知道为什么会发生这种情况吗?查询SELECT * FROM Win32_SerialPort错误吗?

4

5 回答 5

1

好吧,在研究了几个论坛后,我发现如果我运行查询,则列出了与 USB/RS485 适配器关联的 com 端口SELECT * FROM Win32_PnPEntity

但我真的不明白为什么 arduino 的串行端口由查询显示,而另一个端口与另一个查询显示....我的意思是,它们都是 USB<-> 串行适配器!

于 2013-04-23T11:10:12.123 回答
0

我没有 USB<->RS485 适配器,但我怀疑它们不属于“串行端口”类别(这似乎是为 RS232 接口保留的),这可能是它们没有出现在Win32_SerialPort 查询结果。

为了检测和 Arduino 板的连接,我查看了这个注册表项:

HKLM\HARDWARE\DEVICEMAP\SERIALCOMM

对于像这样的条目

\Device\VCP0

(VCP 是要查找的前缀)。

也许您也可以查看此注册表项,或查看其父项 DEVICEMAP,并查看连接 FTDI RS485 适配器时会发生什么。此时检测这些注册表项内容之一的更改应该很简单。

高温高压

于 2013-04-30T11:56:01.950 回答
0

正如@Marcello Romani 指出的那样,FTDI 不属于“串行端口”类别。即使我迟到了,我最近也遇到了这个问题,我使用另一个查询修复了它。您可以查询 Win32_PnPEntity 类,而不是在 WIN32_SerialPort 中搜索。使用此类的一个缺点是查询速度慢。

 using (var searcher = new ManagementObjectSearcher
            ("SELECT * FROM Win32_PnPEntity"))
        {
            string[] portnames = SerialPort.GetPortNames();
            var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();

            foreach (ManagementBaseObject queryObj in ports)
            {
            }

        }
于 2020-03-05T11:32:16.727 回答
0

这可能对你有用。我用它来动态读取系统上 Arduino 的端口号。这里

描述.包含(“uino”)

是为两种板子寻找 Arduino 和 Genuino 关键字。

    public string detectArduinoPort()
    {
        ManagementScope mScope = new ManagementScope();
        SelectQuery query = new SelectQuery("SELECT * FROM Win32_SerialPort");
        ManagementObjectSearcher objectList = new ManagementObjectSearcher(mScope, query);

        try
        {
            foreach (ManagementObject obj in objectList.Get())
            {
                string description = obj["Description"].ToString();
                string deviceId = obj["DeviceID"].ToString();

                if (description.Contains("uino"))
                {
                    return deviceId;
                }
            }
        }
        catch (Exception)
        {

        }
        return "";
    }
于 2018-06-18T13:07:58.787 回答
-1

基本上,这是由于 HID(人机接口设备)

我认为这是由于 arduino 板提供的 HID。Arduino 硬件(因此,微控制器)使用 HID 直接与 PC 通信(因此,不需要额外的设备)。HID 可以充当鼠标、键盘或简单的串行设备(它“简单地”向 PC 声明自己为串行端口)。所以不知何故,与PC通信时有一些“智能”方式。

另一方面,USBtoSerial 转换器和一些 Arduino 板,如嵌入 FTDI(或 CH340)的 Arduino Nano,这些“必须”表现为正常的 comport,因为背后没有智能(HID 背后的那个) )。

于 2018-06-17T01:08:11.797 回答