获取USB适配器的com端口号

时间:2013-04-23 07:46:51

标签: c# windows serial-port usb

我正在尝试编写一个使用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串口(匹配description.Contains("Arduino"))而不是USB RS485端口的com端口。

你知道为什么会这样吗?查询SELECT * FROM Win32_SerialPort是错误的吗?

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

要检测和Arduino板的连接,我会查看此注册表项:

HKLM\HARDWARE\DEVICEMAP\SERIALCOMM

用于

等条目
\Device\VCP0

(VCP是要查找的前缀)。

也许您也可以查看此注册表项,或者查看其父项DEVICEMAP,并查看连接FTDI RS485适配器时会发生什么。 在这一点上检测其中一个注册表项内容的更改应该是直截了当的。

HTH

答案 2 :(得分:0)

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

  

description.Contains(" uino&#34)

是为两个板块的变量寻找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 "";
    }

答案 3 :(得分:0)

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

s = df.stack().value_counts()
print (s)
4    6
5    4
3    3
9    2
7    2
2    2
1    2
8    1
6    1
0    1
dtype: int64

print (s.index[0])
4

print (s.iat[0])
6

答案 4 :(得分:-1)

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

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

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