获取串行端口信息

我有一些代码将串行端口加载到combobox中:

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; 

我想添加端口描述(类似于在设备pipe理器中显示的COM端口)到列表中,并对索引0之后的列表中的项进行sorting (解决方法:参见上面的代码片段)。 有没有人有任何build议添加端口描述? 我正在使用Microsoft Visual C#2008速成版(.NET 2.0)。 任何想法,你可能会感激。 谢谢。

在MSDN上有一个关于这个问题的post :

在C#中获取有关串口的更多信息

嗨Ravenb,

我们无法通过SerialPorttypes获取信息。 我不知道你为什么需要这个信息在你的应用程序。 然而,与你同样的问题有一个解决的线程 。 你可以看看那里的代码,看看它是否可以帮助你。

如果您还有其他问题,请随时告诉我。

最好的问候,布鲁斯周

这篇文章中的链接就是这样的:

如何使用System.IO.Ports.SerialPort获取有关端口的更多信息

您可能可以从WMI查询中获取此信息。 看看这个工具,以帮助您find正确的代码。 为什么你会在乎呢? 这只是USB仿真器的一个细节,正常的串口不会有这个。 一个串口只是通过“COMx”知道的,仅此而已。

编辑:对不起,我拉过你的问题太快了。 我现在意识到你正在寻找一个带有端口名称+端口描述的列表。 我已经更新了相应的代码

使用System.Management,您可以查询所有端口以及每个端口的所有信息(就像设备pipe理器一样)

示例代码(确保添加对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

使用下面的代码片段

执行时提供以下输出。

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

我在这里尝试了很多这样的解决scheme,不适合我,只显示一些端口。 但是下面显示了所有这些和他们的信息。

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

我不太清楚“sorting索引0之后的项目”是什么意思,但是如果你只是想sorting由SerialPort.GetPortNames()返回的string数组,你可以使用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() );