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

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

List tList = new List(); 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 (решены: см. Выше fragment). Есть ли у кого-нибудь предложения по добавлению описаний портов? Я использую Microsoft Visual C # 2008 Express Edition (.NET 2.0). Любые мысли, которые у вас есть, будут оценены по достоинству. Благодарю.

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

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

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

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

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

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

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

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

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

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

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

Используйте следующий fragment кода

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

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

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

  using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%(COM%'")) { var portnames = SerialPort.GetPortNames(); var ports = searcher.Get().Cast().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); } } } 

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

 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() ); 
  • Использование bash для сортировки данных по горизонтали
  • NSFetchedResultsController с датой как sectionNameKeyPath
  • Сортировка буквенно-цифровых строк java
  • Как отсортировать массив объектов, содержащих нулевые элементы?
  • Как сортировать список по свойству в объекте
  • Angularjs неправильный $ index после orderBy
  • Mergesort Python
  • Как я могу отсортировать ArrayList строк в Java?
  • C ++ сортировка и отслеживание индексов
  • Как отсортировать список объектов по определенному полю в C #?
  • Напишите программу, чтобы найти 100 самых больших чисел из массива из 1 миллиарда чисел
  • Давайте будем гением компьютера.