确定.net 3.5中VCP COM端口的最佳方法

时间:2015-12-01 15:29:30

标签: c# .net windows

我有几个不同的设备通过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)的确切模式。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

看起来唯一需要的是改进您的WMI搜索查询。然后DeviceID将是COM端口。

var searcher = new ManagementObjectSearcher ( string.Format ( "select DeviceID from Win32_SerialPort where PnPDeviceID like '%PID_{0}%'", PID ) );