Получение информации о последовательном порте - PullRequest
31 голосов
/ 15 мая 2010

У меня есть код, который загружает последовательные порты в поле со списком:

     List<String> tList = new List<String>(); 

     comboBoxComPort.Items.Clear();

     foreach (string s in SerialPort.GetPortNames())
     {
        tList.Add(s);
     }

     tList.Sort();
     comboBoxComPort.Items.Add("Select COM port...");
     comboBoxComPort.Items.AddRange(tList.ToArray());
     comboBoxComPort.SelectedIndex = 0;

Я хотел бы добавить описания портов (аналогично тому, что показано для COM-портов в диспетчере устройств) в список и отсортировать элементы в списке после индекса 0 (решено: см. выше фрагмент). У кого-нибудь есть предложения по добавлению описаний портов? Я использую Microsoft Visual C # 2008 Express Edition (.NET 2.0). Любые мысли, которые вы можете иметь, будут оценены. Спасибо.

Ответы [ 6 ]

40 голосов
/ 20 мая 2010

РЕДАКТИРОВАТЬ: Извините, я пролетел мимо вашего вопроса слишком быстро. Теперь я понимаю, что вы ищете список с именем порта + описание порта. Я обновил код соответственно ...

Используя System.Management, вы можете запрашивать все порты и всю информацию для каждого порта (как в диспетчере устройств ...)

Пример кода (обязательно добавьте ссылку на System.Management):

using System;
using System.Management;
using System.Collections.Generic;
using System.Linq;
using System.IO.Ports;        

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var searcher = new ManagementObjectSearcher
                ("SELECT * FROM WIN32_SerialPort"))
            {
                string[] portnames = SerialPort.GetPortNames();
                var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();
                var tList = (from n in portnames
                            join p in ports on n equals p["DeviceID"].ToString()
                            select n + " - " + p["Caption"]).ToList();

                tList.ForEach(Console.WriteLine);
            }

            // pause program execution to review results...
            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }
    }
}

Подробнее здесь: http://msdn.microsoft.com/en-us/library/aa394582%28VS.85%29.aspx

29 голосов
/ 20 мая 2010

Использовать следующий фрагмент кода

При выполнении выдает следующий вывод.

serial port : Communications Port (COM1)
serial port : Communications Port (COM2)

Не забудьте добавить

using System;
using System.Management;
using System.Windows.Forms;

Также добавьте ссылку на system.Management (по умолчанию она недоступна)

C #

private void GetSerialPort()
{

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

        foreach (ManagementObject queryObj in searcher.Get())
        {
            if (queryObj["Caption"].ToString().Contains("(COM"))
            {
                Console.WriteLine("serial port : {0}", queryObj["Caption"]);
            }

        }
    }
    catch (ManagementException e)
    {
        MessageBox.Show( e.Message);
    }

}

VB

  Private Sub GetAllSerialPortsName()
        Try
            Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_PnPEntity")
            For Each queryObj As ManagementObject In searcher.Get()
                If InStr(queryObj("Caption"), "(COM") > 0 Then
                    Console.WriteLine("serial port : {0}", queryObj("Caption"))
                End If
            Next
        Catch err As ManagementException
            MsgBox(err.Message)
        End Try
    End Sub

Обновление: Вы также можете проверить на

if (queryObj["Caption"].ToString().StartsWith("serial port"))

вместо

if (queryObj["Caption"].ToString().Contains("(COM"))
15 голосов
/ 20 мая 2010

На MSDN есть сообщение об этой же проблеме:

Получение дополнительной информации о последовательном порте в C #

Привет Равенб,

Мы не можем получить информацию через тип SerialPort. Я не знаю, зачем вам эта информация в вашем приложении. Тем не менее, существует решенная тема с тем же вопросом, что и у вас. Вы можете проверить код там и посмотреть, может ли он вам помочь.

Если у вас возникнут какие-либо проблемы, пожалуйста, дайте мне знать.

С наилучшими пожеланиями, Брюс Чжоу

Ссылка в этом посте идет на этот:

Как получить больше информации о порте с помощью System.IO.Ports.SerialPort

Вы, вероятно, можете получить эту информацию из запроса WMI. Проверьте этот инструмент , чтобы помочь вам найти правильный код. Почему ты все равно? Это просто деталь для эмулятора USB, обычные последовательные порты не будут иметь этого. Последовательный порт просто известен "COMx", ничего более.

12 голосов
/ 11 октября 2017

Я попробовал так много решений здесь, которые не работали для меня, только отображая некоторые порты. Но следующее отображало их всех и их информацию.

        using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%(COM%'"))
        {
            var portnames = SerialPort.GetPortNames();
            var ports = searcher.Get().Cast<ManagementBaseObject>().ToList().Select(p => p["Caption"].ToString());

            var portList = portnames.Select(n => n + " - " + ports.FirstOrDefault(s => s.Contains(n))).ToList();

            foreach(string s in portList)
            {
                Console.WriteLine(s);
            }
        }
    }
2 голосов
/ 15 мая 2010

Я не совсем уверен, что вы подразумеваете под "сортировкой элементов после индекса 0", но если вы просто хотите отсортировать массив строк, возвращаемых SerialPort.GetPortNames(), вы можете использовать Array.Sort .

0 голосов
/ 18 февраля 2011
this.comboPortName.Items.AddRange(
    (from qP in System.IO.Ports.SerialPort.GetPortNames()
     orderby System.Text.RegularExpressions.Regex.Replace(qP, "~\\d",
     string.Empty).PadLeft(6, '0')
     select qP).ToArray()
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...