private const string vidPattern = @"VID_([0-9A-F]{4})";
private const string pidPattern = @"PID_([0-9A-F]{4})";
struct ComPort // custom struct with our desired values
{
public string name;
public string vid;
public string pid;
public string description;
}
private static List<ComPort> GetConnectedSerialDevices()
{
using (var searcher = new ManagementObjectSearcher
("SELECT * FROM WIN32_SerialPort"))
{
var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();
return ports.Select(p =>
{
ComPort c = new ComPort();
c.name = p.GetPropertyValue("DeviceID").ToString();
c.vid = p.GetPropertyValue("PNPDeviceID").ToString();
c.description = p.GetPropertyValue("Caption").ToString();
Match mVID = Regex.Match(c.vid, vidPattern, RegexOptions.IgnoreCase);
Match mPID = Regex.Match(c.vid, pidPattern, RegexOptions.IgnoreCase);
if (mVID.Success)
c.vid = mVID.Groups[1].Value;
if (mPID.Success)
c.pid = mPID.Groups[1].Value;
return c;
}).ToList();
}
}
public static string FindSerialName(string VID, string PID)
{
// 연될 되어있는 전체 컴포트 리스트 저장
List<ComPort> ports = GetConnectedSerialDevices();
// 매개변수인 VID와 PID에 해당하는 포트이름만 불러온다.
ComPort com = ports.FindLast(c => c.vid.Equals(VID) && c.pid.Equals(PID));
return com.name;
}
}
추가
FindLast를 FindAll로 사용하면 해당 VID와 PID에 해당하는 리스트 전부를 불러온다.
출저
스택오버플로우