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看起来不同).
我怀疑它取决于驱动程序的实现,因为我有一些usb设备可以列出他们的端口而有些则没有.
小智 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)