持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
阅读本文大约需要 2 分钟
前言
COM口,即外接硬件设备,与电脑通信的串口,如下图 “端口(COM和LPT)”
- 如何获取 COM 口?
- 如何拿到 COM口 的名称?
- 如何判断 COM口 的状态?
本文摘自实际项目应用场景,上述三个问题依次来自客户对需求的变更(狗头)
1. 如何获取 COM 口
网上普遍能找到的方法是这个,直接就能拿到 COM口 的列表
string[] coms= System.IO.Ports.SerialPort.GetPortNames();
获取到的结果: ["COM1", "COM3"]
2. 如何获取 COM口 的名称
用户使用一段时间后,觉得界面上只能展示 COM1, COM3,不是很科学。 因为他们根本不知道他们想用的到底是哪个 COM口,还需要去挨个试,或者去设备管理器确认。 于是希望我们拿到 COM口 的同时,还能获取到他们的别名。
于是便有了下面的方法
ManagementObjectSearcher 微软官网说明,可用于检索管理对象。 这里我们通过名称匹配,查找出带有 '(COM' 的设备,之后读取其 "Name" 属性,就拿到了别名
#region 新版获取 COM 内容的方法,能获取到 别名(COM*)
private List<string> getDevicePortName()
{
List<string> list = new List<string>();
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher
("select * from Win32_PnPEntity where Name like '%(COM%'"))
{
var hardInfos = searcher.Get();
foreach (var hardInfo in hardInfos)
{
if (hardInfo.Properties["Name"].Value != null)
{
string deviceName = hardInfo.Properties["Name"].Value.ToString();
if (string.IsNullOrEmpty(deviceName))
continue;
list.Add(deviceName);
}
}
}
return list;
}
3. 如何判断 COM口 的状态
最近客户又提出了新需求:有的 COM口 我已经禁用了,怎么还能获取到呢?获取到了,你倒是提示我一下啊。不然我设置了也不好使
这个状态,网上还真不好找,最后我索性自己尝试。
第二点中提到了,通过 ManagementObjectSearcher 可以获取到 ManagementBaseObject,于是我遍历了 ManagementBaseObject 的所有 Property,还真让我找到了一个属性 Status
- 当 COM口 有效时,
Status 为 OK - 当 COM口 被禁用,
Status 为 Error
所以便有了以下方法:
private bool IsCOMPortValid(ManagementBaseObject hardInfo)
{
if (hardInfo == null || hardInfo.Properties == null || hardInfo.Properties["Status"].Value == null)
return false;
return hardInfo.Properties["Status"].Value.ToString() == "OK";
}
后记
实际应用中,我们还根据文中提到的2,3点,对上层应用做了优化,比如:
- 根据 COM口 的别名,自动匹配、设置 COM口,省去了用户手动设置的麻烦。 同时当用户将外设插到别的USB口的时候,也可以自动匹配,不用手动重新选择
- 根据获取到的 COM口 是否有效,在UI上进行展示该 COM口 已禁用,
IsEnable = false不可选
没想到一个 COM口 也能被整出这么多花样。仔细揣摩就能给用户带来更好的体验。
代码已经上传到了我的 gitee 的 WPF-Demo 仓库,有需要的请自取