【发布时间】:2015-12-01 15:29:29
【问题描述】:
我有几个不同的设备通过 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 端口看起来容易出错 - 如果设备没有遵循 @ 的确切模式的名称,则很容易损坏987654324@.
有没有更好的办法?
【问题讨论】: