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

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

     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). Любые мысли, которые Вы можете иметь, ценились бы.Спасибо.

31
задан Jim Fell 13 January 2012 в 16:51
поделиться

4 ответа

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

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

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

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

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

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

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

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

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

16
ответ дан 27 November 2019 в 21:28
поделиться

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

2
ответ дан 27 November 2019 в 21:28
поделиться

EDIT: Извините, я проскочил мимо вашего вопроса слишком быстро. Теперь я понял, что вы ищете список с именем порта + описание порта. Я обновил код соответствующим образом...

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

Пример кода (не забудьте добавить ссылку на 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

42
ответ дан 27 November 2019 в 21:28
поделиться

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

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

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"))
30
ответ дан 27 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: