MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Вывод информации о COM-порте"
Answer 798312
Обычно можно просто сделать выборку из Win32_SerialPort по DeviceID (он содержит имя порта, возвращаемое GetPortNames):
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Text; using System.Windows.Forms; using System.Management; namespace WmiTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /*Возвращает информацию о последовательном порте с указанным именем*/ public string GetComPortInformation(string name) { ManagementObjectCollection mbsList = null; StringBuilder sb = new StringBuilder(2000); ManagementObjectSearcher mbs = new ManagementObjectSearcher( "SELECT * FROM Win32_SerialPort WHERE DeviceID = '"+name+"'" ); using (mbs) { mbsList = mbs.Get(); foreach (ManagementObject mo in mbsList) { object val = mo["Name"]; if (val != null) sb.AppendLine( val.ToString()); foreach (var p in mo.Properties) { sb.Append( "* " + p.Name + ": "); if (p.Value != null) { sb.Append( p.Value.ToString()); } else sb.Append( "null"); sb.AppendLine(); } break; } return sb.ToString(); } } private void button1_Click(object sender, EventArgs e) { string com_port = comboBox1.SelectedText; //Имя порта, например "COM1" textBox1.Text = GetComPortInformation(com_port); } } }
Это сработает для всех физических COM-портов (ну, тех которые система считает физическими - т.е. для которых в диспетчере можно настроить скорость и прочие параметры). Для некоторых виртуальных портов это может не сработать. Это относится главным образом к виртуальным порта USB-устройств, работающих с нестандартным драйвером - DeviceID у таких устройств начинается не с "USB\", а с вендорно-специфичной строки. Тогда, если приведенный запрос не вернул ничего, можно попробовать как-то так (вернет меньше свойств):
"SELECT * FROM Win32_PnPEntity where ClassGuid = '{4d36e978-e325-11ce-bfc1-08002be10318}' and Service <> 'Parport' AND Name like '%" + name + "%'"
Однако и такой способ - не лучший вариант, так как он основан на фильтрации по имени устройства, которое может и не содержать внутреннего имени порта. Более правильно связывать Win32_PnpEntity с портом через PnpDeviceID, используя параметр PortName в ветке реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\(PnpDeviceID)\DeviceParameters
. Это реализовано в следующем примере, более громоздком, но позволяющим корректно обработать большинство ситуаций и вывести максимальное количество доступных сведений.using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Text; using System.Windows.Forms; using System.Management; using Microsoft.Win32; namespace WmiTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /*Получение имени COM-порта по его PnpDeviceID*/ public string PortNameFromID(string PnpDeviceID) { object result = Registry.GetValue( "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\" + PnpDeviceID + "\\Device Parameters", "PortName", ""); if (result != null) return result as string; else return ""; } /*Возвращает информацию о последовательном порте с указанным именем*/ public string GetComPortInformation(string name) { ManagementObjectSearcher mbs; ManagementObjectCollection mbsList = null; StringBuilder sb = new StringBuilder(2000); object val; //попытка получить данные из Win32_SerialPort mbs = new ManagementObjectSearcher("SELECT * FROM Win32_SerialPort WHERE DeviceID = '"+name+"'"); using (mbs) { mbsList = mbs.Get(); foreach (ManagementObject mo in mbsList) { val = mo["Name"]; if (val != null) sb.AppendLine( val.ToString()); //порт найден, возвращаем данные foreach (var p in mo.Properties) { sb.Append( "* " + p.Name + ": "); if (p.Value != null) { sb.Append( p.Value.ToString()); } else sb.Append( "null"); sb.AppendLine(); } return sb.ToString(); }//end foreach } //порт не найден, выберем все последовательные порты из Win32_PnPEntity mbs = new ManagementObjectSearcher( "SELECT * FROM Win32_PnPEntity where ClassGuid = '{4d36e978-e325-11ce-bfc1-08002be10318}' and Service <> 'Parport'" ); using (mbs) { mbsList = mbs.Get(); foreach (ManagementObject mo in mbsList) { //находим идентификатор val = mo["PnpDeviceID"]; if (val == null) continue; string id = val.ToString(); if (id.Length == 0) continue; //находим имя порта для данного PnpDeviceID в реестре if (PortNameFromID(id) == name) { //порт найден, возвращаем данные sb.Clear(); val = mo["Name"]; if (val != null) sb.AppendLine(val.ToString()); foreach (var p in mo.Properties) { sb.Append("* " + p.Name + ": "); if (p.Value != null) { sb.Append(p.Value.ToString()); } else sb.Append("null"); sb.AppendLine(); } return sb.ToString(); } }//end foreach } return "Информация не найдена"; } private void button1_Click(object sender, EventArgs e) { string com_port = comboBox1.SelectedText; textBox1.Text = GetComPortInformation(com_port); } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.