1、使用 ManagementObjectSearcher 搜索本地所有串口(Caption、DeviceID)
2、查询注册表 LocalMachine\\SYSTEM\\CurrentControlSet\\Enum\\{deviceId}\\Device Parameters 获取对应的串口名称
完整示例
/// <summary>
/// 串口
/// </summary>
public class SerialPortDes
{
/// <summary>
/// 友好名称
/// </summary>
public string Caption { get; internal set; }
/// <summary>
/// 串口名称
/// </summary>
public string PortName { get; internal set; }
}
/// <summary>
/// 根据设备ID获取串口名
/// </summary>
/// <param name="deviceId"></param>
/// <returns></returns>
public string GetPortName(string deviceId)
{
string path = $"SYSTEM\\CurrentControlSet\\Enum\\{deviceId}\\Device Parameters";
var reg = Registry.LocalMachine.OpenSubKey(path);
return reg.GetValue("PortName")?.ToString();
}
/// <summary>
/// 获取本地所有串口
/// </summary>
/// <returns></returns>
public List<SerialPortDes> GetSerialPorts()
{
string query = "SELECT * FROM Win32_PnPEntity WHERE PNPClass = 'Ports'";
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
var hardInfos = searcher.Get();
List<SerialPortDes> ports = new List<SerialPortDes>();
foreach (var hardInfo in hardInfos)
{
string deviceID = hardInfo.Properties["DeviceID"].Value.ToString();
string caption = hardInfo.Properties["Caption"].Value.ToString();
SerialPortDes ss = new SerialPortDes();
string portName = GetPortName(deviceID);
ss.Caption = caption;
ss.PortName = portName;
ports.Add(ss);
}
return ports;
}
}