我有几个不同的设备通过VCP连接,我需要使用C#确定它们所在的端口。这对于跟踪目的也很重要。如果设备已拔下并重新插入或暂时断电,有时COM端口会发生变化。
我正在寻找一种可靠的方法来确定这一点。目前,我发现的最好方法是使用PID定位设备并从设备名称解析COM端口,即
public static bool IsDevice ( ManagementObject Device, string PID ) {
try {
return new Regex ( string.Format ( @"USB\\VID_[^&]+&PID_{0}\\.*", PID ) ).IsMatch ( ( string ) Device["DeviceID"] );
} catch ( Exception ) {
return false;
}
}
public static string GetVCP_COMPort ( ManagementObject Device ) {
try {
return new Regex ( @".*\((COM[0-9]+)\).*" ).Match ( ( string ) Device["Name"] ).Groups[1].Value;
} catch ( Exception e ) {
return string.Empty;
}
}
...
var searcher = new ManagementObjectSearcher ( "Select * from Win32_PnPEntity" );
var coll = searcher.Get ();
foreach ( ManagementObject o in coll )
if ( IsDevice ( o, PID ) ) {
var port = new SerialPort ( GetVCP_COMPort ( o ) );
}
我对查找设备即IsDevice
的方法感到非常满意,但是从设备名称解析COM端口看起来容易出错 - 如果设备没有名称则容易破解遵循Device Name (COMXY)
的确切模式。
有更好的方法吗?
答案 0 :(得分:0)
看起来唯一需要的是改进您的WMI搜索查询。然后DeviceID将是COM端口。
var searcher = new ManagementObjectSearcher ( string.Format ( "select DeviceID from Win32_SerialPort where PnPDeviceID like '%PID_{0}%'", PID ) );