簡體   English   中英

在C#中獲取端口名稱

[英]Getting port names in c#

我是嵌入式編程的新手,我是tryig來獲取列表中的所有端口名稱。 我猜這是最基本的操作。

using System.IO.Ports;    
string[] ports = SerialPort.GetPortNames();

不知道我要在哪里進行此基本操作,但是字符串為空。 任何導致我做錯事情的線索都會有所幫助

GetPortNames將僅收集有效的已連接COM端口。

如果試圖將COM端口收集為斷開連接的端口,則需要在注冊表中進行搜索。 這是我根據VID和PID查找所需的正確設備的方法。

public class ComPortFinder
{
    public static List<DeviceInfo> FindConnectedDevices(uint vid, uint pid)
    {
        string pattern = string.Format("^VID_{0:X4}.PID_{1:X4}", vid, pid);
        Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase);

        List<DeviceInfo> devices = new List<DeviceInfo>();

        RegistryKey rk1 = Registry.LocalMachine;
        RegistryKey rk2 = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum");

        foreach (String s3 in rk2.GetSubKeyNames())
        {
            RegistryKey rk3 = rk2.OpenSubKey(s3);
            foreach (String s in rk3.GetSubKeyNames())
            {
                if (_rx.Match(s).Success)
                {
                    RegistryKey rk4 = rk3.OpenSubKey(s);
                    foreach (String s2 in rk4.GetSubKeyNames())
                    {
                        RegistryKey rk5 = rk4.OpenSubKey(s2);
                        RegistryKey rk6 = rk5.OpenSubKey("Device Parameters");
                        if (!string.IsNullOrEmpty((string)rk6.GetValue("PortName")))
                        {
                            DeviceInfo di = new DeviceInfo()
                            {
                                VenderId = vid,
                                ProductId = pid,
                                SerialNumber = "UNKNOWN",
                                ComPort = rk6.GetValue("PortName").ToString()
                            };
                            devices.Add(di);
                        }
                    }
                }
            }
        }
        return devices;
    }
}

public struct DeviceInfo
{
    public uint VenderId;
    public uint ProductId;
    public string SerialNumber;
    public string ComPort;
}

我不為此而功勞,因為我相信這是從另一個StackOverflow答案中偷走的,但希望它會有所幫助。

根據Juanma的回答,您可以在此處使用wmi工具獲取所有端口。 如何查找可用的COM端口?

try
{
    ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\WMI",
        "SELECT * FROM MSSerial_PortName");

foreach (ManagementObject queryObj in searcher.Get())
{
    Console.WriteLine("-----------------------------------");
    Console.WriteLine("MSSerial_PortName instance");
    Console.WriteLine("-----------------------------------");
    Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]);

    Console.WriteLine("-----------------------------------");
    Console.WriteLine("MSSerial_PortName instance");
    Console.WriteLine("-----------------------------------");
    Console.WriteLine("PortName: {0}", queryObj["PortName"]);

    //If the serial port's instance name contains USB 
    //it must be a USB to serial device
    if (queryObj["InstanceName"].ToString().Contains("USB"))
    {
        Console.WriteLine(queryObj["PortName"] + " 
        is a USB to SERIAL adapter/converter");
    }
}
}

catch (ManagementException e)
{
    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}

不要忘記添加System.Management參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM