在C#中查找有关通过USB连接的所有串行设备的信息

seb*_*ebo 26 .net c# wmi serial-port

我的项目需要在连接到USB时检测特定设备.我可以识别此设备的唯一方法是通过其描述/设备名称,而不是com端口.我发现执行正确的功能是使用WMI查询并检查name属性:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from WIN32_SerialPort");
            foreach (ManagementObject port in searcher.Get())
            {
                deviceName = (string)foundPort.GetPropertyValue("Name"); 
                ...
Run Code Online (Sandbox Code Playgroud)

我最初通过连接我的手机对此进行了测试,并且查询按预期返回了COM3上找到的手机.然后,我连接了另一个设备(一个USB到串行转换器,它更像我需要这个项目的设备),查询根本找不到它.它只能找到手机.但是,此设备显示在设备管理器中的端口COM4上.更糟糕的是,SerialPort类找到了两个设备,但它没有提供识别设备所需的信息:

    string[] tempPorts = SerialPort.GetPortNames();
Run Code Online (Sandbox Code Playgroud)

我已经在SO和其他地方阅读了很多线程,但找不到满意的解决方案.有人可以澄清为什么WIN32_SerialPort查询找不到我的其他设备?出于某种原因它不被认为是win32串口吗?并且,有人可以指出我解决这个问题的方向吗?

Ale*_*exS 24

如何列出所有串口:

硬件供应商可以使用多个系统定义的设备安装类.正确编写的驱动程序COM-Ports应该使用Ports (COM & LPT ports)-class(guid :) 4d36e978-e325-11ce-bfc1-08002be10318.该类也可能由设备管理器使用.

因此,您可以使用以下查询列出您在devicemanager中看到的每个串行端口:

ManagementObjectSearcher searcher = new ManagementObjectSearcher(
    "root\\CIMV2",
    "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\""
);
foreach (ManagementObject queryObj in searcher.Get())
{
    // do what you like with the Win32_PnpEntity
}
Run Code Online (Sandbox Code Playgroud)

请参阅Win32_PnPEntity -class的详细说明.您应该拥有识别设备所需的一切.

为了确定端口号,我检查了name属性并将其解压缩.到目前为止,这个工作正常,但我不知道端口号是否保证包含在名称中.到目前为止,我还没有找到任何串口设备,它没有包含在名称中的端口号.

以上查询查找每个串口设备,无论是蓝牙SPP,FTDI芯片,主板上的端口,扩展卡还是某些调制解调器驱动程序生成的虚拟串口(即Globetrotter GTM66xxW).

要确定连接类型(蓝牙,USB等),您可以检查deviceid(查看deviceid的第一部分).在那里你也可以提取bt-mac地址(小心一点:至少在Windows 7和Windows XP上,deviceid看起来不同).

关于为什么有些设备没有列在Win32_SerialPort中:

我怀疑它取决于驱动程序的实现,因为我有一些usb设备可以列出他们的端口而有些则没有.

  • 要获取列出的所有**设备,请使用以下查询:`“ SELECT * FROM Win32_PnPEntity WHERE Name Like'%(COM [0-9]%'” (2认同)

小智 6

我想我看到你正在尝试做的,看看这个代码使用WMICodeCreator造(链接到WMICodeCreator http://www.microsoft.com/en-us/download/details.aspx?id=8572从这篇文章)的HTTP ://www.codeproject.com/Articles/32330/A-Useful-WMI-Tool-How-To-Find-USB-to-Serial-Adapto

//Below is code pasted from WMICodeCreator
try
{
    ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\WMI",
        "SELECT * FROM MSSerial_PortName");

    foreach (ManagementObject queryObj in searcher.Get())
    {
        Console.WriteLine("-----------------------------------");
        Console.WriteLine("MSSerial_PortName instance");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]);

        Console.WriteLine("-----------------------------------");
        Console.WriteLine("MSSerial_PortName instance");
        Console.WriteLine("-----------------------------------");
        Console.WriteLine("PortName: {0}", queryObj["PortName"]);

        //If the serial port's instance name contains USB 
        //it must be a USB to serial device
        if (queryObj["InstanceName"].ToString().Contains("USB"))
        {
            Console.WriteLine(queryObj["PortName"] + " 
            is a USB to SERIAL adapter/converter");
        }
    }
}
catch (ManagementException e)
{
    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
} 
Run Code Online (Sandbox Code Playgroud)

  • 我之前已经看过这篇文章,但是通过此查询调用Get()失败,并出现了一些奇怪的错误。我认为我得到了类似“不支持管理”的信息,然后对其进行了调整后得到了“权限被拒绝”。就像我在上面的评论中说的那样,我已经找到了解决方案,并且通过使用对Win32_PnPEntity的查询来实现,然后通过查找其name属性包含“ USB Serial Port(COM)”的实体来缩小搜索范围。 (3认同)