【问题标题】:get com port number of an USB adapter获取 USB 适配器的 com 端口号
【发布时间】:2013-04-16 08:07:30
【问题描述】:

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

我想让程序对用户友好,因此我不希望用户手动检查 com 端口号,但我想自动检测它。这是代码的sn-p

    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错了吗?

【问题讨论】:

    标签: c# windows serial-port usb


    【解决方案1】:

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

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

    【讨论】:

    • 你有链接吗?
    【解决方案2】:

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

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

    HKLM\HARDWARE\DEVICEMAP\SERIALCOMM
    

    对于像

    这样的条目
    \Device\VCP0
    

    (VCP 是要查找的前缀)。

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

    HTH

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 所有 USB 设备都有“智能”——HID 是最简单的设备之一。 FTDI 比普通的 16550 UART 具有更多的功能——它们还支持 GPIO、并行传输和同步串行传输(I2C、SPI、JTAG)。
      【解决方案4】:

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

      description.Contains("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 "";
          }
      

      【讨论】:

        【解决方案5】:

        正如@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)
                    {
                    }
        
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-01
          • 2016-05-13
          • 1970-01-01
          相关资源
          最近更新 更多