查询WMI WIN32_SerialPort锁定串口

时间:2014-02-13 16:52:35

标签: c# .net bluetooth serial-port wmi

运行以下代码会锁定我的com端口,我很想知道原因。我在SO上找到了几个类似的未解答的问题...

我正在使用蓝牙适配器(RN-41)进行串行连接。适配器SPP创建两个虚拟COM端口(这对我们测试的所有适配器都是通用的)。 Windows将它们标记为Incoming和Outgoing,但Incoming是唯一一个实际携带串行数据的文件。

这让我有了“额外的”虚拟串口。我使用可用的Com端口填充下拉列表,以便用户可以从列表中选择要连接的端口。

在此之前,我正在过滤该列表以删除'假'com端口。这是我的代码:

public string checkBluetoothCom()
        {
            string bluetoothComm = "";
            List<string> badComPorts = new List<string>();
            ManagementClass processClass = new ManagementClass("WIN32_SerialPort");

            ManagementObjectCollection Ports = processClass.GetInstances();

            foreach (ManagementObject property in Ports)
            {
                if (property.GetPropertyValue("Name").ToString().Contains("Bluetooth"))
                {
                    string hardwareAddress = property.GetPropertyValue("PNPDeviceID").ToString().Split('&')[4].Split('_')[0];
                    if (!hardwareAddress.All(c => c == '0'))
                    {
                        bluetoothComm = property.GetPropertyValue("DeviceID").ToString();
                    }
                    else
                    {
                        badComPorts.Add(property.GetPropertyValue("DeviceID").ToString());
                    }
                }
            }

            Console.WriteLine("Removing {0} items from comm port list", badComPorts.Count);
            ports.RemoveAll(item => badComPorts.Contains(item));

            return bluetoothComm;
        }

问题是,在此运行之后我的Com Port锁定并且我无法建立任何连接,直到我移除我的蓝牙适配器并重新启动远程设备(RN-41)。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果查询“Win32_PnPEntity”而不是“Win32_SerialPort”并检查COM端口ClassGuid {4d36e978-e325-11ce-bfc1-08002be10318},则端口未被锁定或访问。

PowerShell示例:

Get-WmiObject -Query "SELECT Name,DeviceID FROM Win32_PnPEntity WHERE ClassGuid=`"{4d36e978-e325-11ce-bfc1-08002be10318}`""

这给出了可以在设备管理器中找到的所有COM端口的列表。

来源:Finding information about all serial devices connected through USB in C#

答案 1 :(得分:0)

对于某些资源类型(通常是物理端口),使用“同步”(甚至“半同步”)WQL查询可能会中断(甚至导致拒绝服务)管理这些资源的服务。

一个例子是,如果在插入USB闪存设备时查询win32_LogicalDisk,它可能无法作为逻辑卷安装。

您可能需要进行“异步”查询。

参考:How to perform Asynchronous WMI WQL queries.C#

有两种“异步”WQL查询使用者:“临时”和“永久”。

“临时”消费者是您只运行轮询循环的程序,发送“异步”WQL查询并带有一些超时(比如说2秒)。如果超时内没有发生任何事情,查询将返回一个空的结果集,并重新启动循环(发送另一个查询)。

“永久”消费者已在WMI服务中注册。 Windows {0}} for Windows Powershell是该领域工具的一个很好的例子。