У меня есть некоторый код, который загружает последовательные порты в поле комбинированного списка:
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). Любые мысли, которые Вы можете иметь, ценились бы.Спасибо.
На MSDN есть сообщение об этой же проблеме:
Получение дополнительной информации о последовательном порте на C #
Привет, Равенб,
Мы можем не получаю информацию через тип SerialPort. Я не знаю, зачем вам эта информация в вашем приложении. Однако есть решенная ветка с тем же вопросом, что и вы. Вы можете проверить код там и посмотреть, может ли он вам помочь.
Если у вас возникнут дополнительные проблемы, дайте мне знать.
С уважением, Брюс Чжоу
Ссылка в этом посте ведет на эту:
Как получить дополнительную информацию о порте с помощью System.IO.Ports.SerialPort
Вы, вероятно, можете получить эту информацию из запроса WMI. Ознакомьтесь с этим инструментом , чтобы помочь вам найти правильный код. Зачем тебе все равно? Это просто деталь для эмулятора USB, у обычных последовательных портов этого не будет. Последовательный порт обозначается просто «COMx», не более того.
Я не совсем понимаю, что вы имеете в виду под «сортировкой элементов после индекса 0», но если вы просто хотите отсортировать массив строк, возвращаемых SerialPort.GetPortNames ()
, вы можете использовать Array.Sort .
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
Используйте следующий фрагмент кода
При выполнении он дает следующий вывод.
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"))