Подтвердить что ты не робот

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

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

     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 С# 2008 Express Edition (.NET 2.0). Любые мысли, которые у вас есть, будут оценены по достоинству. Спасибо.

4b9b3361

Ответ 1

Существует сообщение об этой же проблеме в MSDN:

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

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

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

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

С уважением, Брюс Чжоу

Ссылка в этом сообщении касается этого:

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

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

Ответ 2

ИЗМЕНИТЬ: Извините, я слишком быстро пропустил ваш вопрос. Теперь я понимаю, что вы ищете список с именем порта и описанием порта. Я обновил код соответственно...

Используя 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();

                foreach (string s in tList)
                {
                    Console.WriteLine(s);
                }
            }

            // 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

Ответ 3

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

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

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

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

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

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

С#

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"))

Ответ 4

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

        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);
            }
        }
    }

Ответ 5

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

Ответ 6

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()
);