运行以下代码会锁定我的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)。有什么想法吗?
答案 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是该领域工具的一个很好的例子。