C# 获取COM串口信息

1,636 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

阅读本文大约需要 2 分钟

前言

COM口,即外接硬件设备,与电脑通信的串口,如下图 “端口(COM和LPT)”

image.png

  1. 如何获取 COM 口?
  2. 如何拿到 COM口 的名称?
  3. 如何判断 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口 的状态

image.png

最近客户又提出了新需求:有的 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点,对上层应用做了优化,比如:

  1. 根据 COM口 的别名,自动匹配、设置 COM口,省去了用户手动设置的麻烦。 同时当用户将外设插到别的USB口的时候,也可以自动匹配,不用手动重新选择
  2. 根据获取到的 COM口 是否有效,在UI上进行展示该 COM口 已禁用,IsEnable = false不可选

没想到一个 COM口 也能被整出这么多花样。仔细揣摩就能给用户带来更好的体验。

代码已经上传到了我的 gitee 的 WPF-Demo 仓库,有需要的请自取