越来越多的人用 C#做上位机,但是大多数人上位机串口选择中只能选到串口号,无法看到描述(也就是设备管理器中看到的名称),下面跟着天书一起让自己的上位机高大上起来!
相信很多人在搜索资料的时候看到了调用 setupapi.dll 来获取,.NET 很多功能就是封装的 API 函数,再在程序里整个 API 函数岂不成 C 艹了,让我们用点高端的 WMI!
首先在头部加上引用(如果提示没有的话,先在解决方案资源管理器→项目名→引用中勾选)
using System.Management;
习惯性的做个类:
/// <summary> /// 天书串口类型 /// </summary> public class TSSerialPort { /// <summary> /// 串口号 /// </summary> public string Name { get; protected set; } /// <summary> /// 描述 /// </summary> public string Des { get; protected set; } /// <summary> /// 制造商 /// </summary> public string Manu { get; protected set; } public override string ToString() { return Name + " - " + Des; } /// <summary> /// 获取串口们 /// </summary> /// <returns> 天书串口类型</returns> public static List<TSSerialPort> GetPorts() { List<TSSerialPort> back = new List<TSSerialPort>(); using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity")) //调用 WMI,获取 Win32_PnPEntity,即所有设备 { var hardInfos = searcher.Get(); foreach (var hardInfo in hardInfos) { if ((hardInfo.Properties["Name"].Value != null) && (hardInfo.Properties["Name"].Value.ToString().Contains("COM"))) //筛选出名称中包含 COM 的 { TSSerialPort temp = new TSSerialPort(); string s = hardInfo.Properties["Name"].Value.ToString(); //获取名称 int p = s.IndexOf('('); temp.Des = s.Substring(0, p); //截取描述(名称) temp.Name = s.Substring(p + 1, s.Length - p - 2); //截取串口号 temp.Manu = hardInfo.Properties["Manufacturer"].Value.ToString(); //获取制造商 back.Add(temp); } } searcher.Dispose(); } return back; } }
有关 Win32_PnPEntity 的更多属性,参见 MSDN 官方文档 http://msdn.microsoft.com/en-us/library/aa394353.aspx
功能不够用?查看完整版:TSLib.Port.TSSerialPort
Comments | NOTHING