越来越多的人用 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