> ## Content Index
> Fetch the complete content index at: https://blog.skitisu.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# C#获取串口的串口号/名称/描述/制造商
- URL: https://blog.skitisu.com/csharp-get-serial-port-name-description-manufacturer/
- Published: 2014-08-10T15:22:45.000Z
- Updated: 2019-06-16T11:09:50.000Z
- Author: SkiTiSu
- Tags: 探索, 编程, #Import 2026-10-21 14:41

[![选择串口](https://blog.skitisu.com/wp-content/uploads/2014/08/%E9%80%89%E6%8B%A9%E4%B8%B2%E5%8F%A3.png)](https://blog.skitisu.com/wp-content/uploads/2014/08/%E9%80%89%E6%8B%A9%E4%B8%B2%E5%8F%A3.png)

越来越多的人用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](http://msdn.microsoft.com/en-us/library/aa394353.aspx?ref=blog.skitisu.com)

功能不够用？查看完整版：[TSLib.Port.TSSerialPort](https://github.com/SkiTiSu/TSLib/blob/master/TSLib/Port/TSSerialPort.cs?ref=blog.skitisu.com)