获取串行端口信息
我有一些代码将串行端口加载到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() );