c# - 查询 WMI WIN32_SerialPort 锁定串口

标签 c# .net bluetooth serial-port wmi

运行下面的代码会锁定我的 com 端口,我很想知道为什么。我在 SO 上发现了几个类似的未解答的问题...

我正在使用蓝牙适配器 (RN-41) 进行串行连接。适配器 SPP 创建两个虚拟 com 端口(这对于我们测试过的所有适配器都是通用的)。 Windows 将它们标记为“传入”和“传出”,但“传入”是唯一真正携带串行数据的。

这给我留下了“额外的”虚拟串行端口。我用可用的 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 端口会锁定,并且在移除蓝牙适配器并重新启动远程设备 (RN-41) 之前我无法建立任何连接。有什么想法吗?

最佳答案

如果您查询“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#

关于c# - 查询 WMI WIN32_SerialPort 锁定串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21760445/

相关文章:

c# - 为什么序列化 double[] 在 WinCE 中不起作用?

.net - 未安装 .NET Framework 时会发生什么情况?

c# - GIF 转 PNG : only first frame extracted

c# - Moq 验证使用返回中修改的对象,而不是实际传入的对象

c# - WCF 用户身份验证最佳实践

ios - iOS 13如何使用蓝牙同时连接多个AirPods?

command-line - 来自命令行的蓝牙

android - 如何关闭 BluetoothSocket 在 Android 中的屏幕旋转?

c# - 如何在vs2010中开发64位版office的Microsoft office word addin

c# - 如何检查 XElement 是否有任何子节点?