首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取USB适配器的COM端口号

获取USB适配器的COM端口号
EN

Stack Overflow用户
提问于 2013-04-23 15:46:51
回答 4查看 7.1K关注 0票数 0

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

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

代码语言:javascript
复制
    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是否错误?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-23 19:10:12

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-30 19:56:02

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

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

代码语言:javascript
复制
HKLM\HARDWARE\DEVICEMAP\SERIALCOMM

对于以下条目:

代码语言:javascript
复制
\Device\VCP0

(VCP是要查找的前缀)。

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

HTH

票数 0
EN

Stack Overflow用户

发布于 2020-03-05 19:32:17

正如@Marcello Romani指出的那样,FTDI不属于“串口”类别。尽管我迟到了,但我最近遇到了这个问题,我用另一个查询解决了这个问题。您可以查询Win32_PnPEntity class.One,而不是在WIN32_SerialPort中进行搜索。使用此类的缺点是查询速度很慢。

代码语言:javascript
复制
 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)
            {
            }

        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16163773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档