WMI:获取所有串行(COM)端口列表,包括虚拟端口
问题描述:
我目前正在开发一个C#程序,与Arduino微控制器进行交互。该程序有一个组合框,您可以在其中选择COM端口。 μc通过USB和虚拟COM端口(CH340)连接。WMI:获取所有串行(COM)端口列表,包括虚拟端口
我使用下面的代码填充组合框的可用COM端口。
private void Form1_Load(object sender, EventArgs e)
{
string[] PortNames = SerialPort. GetPortNames();
comboBoxPort.Items.AddRange(PortNames);
}
这样做的缺点是,你必须看看进入设备管理器,看看哪一个是正确的为μC。例如我的电脑有4个活动COM端口,一个物理端口,2个虚拟端口和另一个虚拟端口。我正在寻找与相关的COM口,以显示该设备的完整名称(比如,你可以在设备管理器中找到它)
COM-ports in the Device Manager
后位的研究,我发现了一种方法通过使用WMI有另一种可能性。经过对“WMI Code Creator”的大量测试后,我不知道还有什么可以尝试完成我参加过的活动。我尝试过的所有命名空间和类只生成像COM1,COM2这样的COM端口,或者它们生成对程序用户无用的硬件ID。 下面的代码或多或少正是我正在寻找的,但它只适用于COM端口中的“真实”构建。
using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
public class MyWMIQuery
{
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_SerialPort");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("Win32_SerialPort instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("Name: {0}", queryObj["Name"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
}
}
是否有任何其他可能的方式获得所有COM端口的列表,如有一个设备管理器的内幕?是否有可能使用设备的硬件ID来以某种方式识别它们,然后在第二步中为它们获取正确的名称?
如果我能得到一些帮助,我会非常高兴。必须有办法做到这一点,但我找不到它。
和SRY我的英语水平,如果事情听起来很奇怪:)
答
由于mentiont之前这里是完整的工作代码,以填补所有avaible COM端口组合框和seletion后设置相关的端口。
(原来的答案如何获得端口名称 - >link)
感谢@o_O的链接,我希望有人能发现此代码非常有用。
private void Form1_Load(object sender, EventArgs e)
{
// Get all serial (COM)-ports you can see in the devicemanager
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\cimv2",
"SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"");
// Sort the items in the combobox
CmdBoxPort.Sorted = true;
// Add all available (COM)-ports to the combobox
foreach (ManagementObject queryObj in searcher.Get())
CmdBoxPort.Items.Add(queryObj["Caption"]);
}
private void CmdBoxPort_SelectedIndexChanged(object sender, EventArgs e)
{
// Set the right port for the selected item.
// The portname is based on the "COMx" part of the string (SelectedItem)
string item = CmdBoxPort.SelectedItem.ToString();
// Search for the expression "(COM" in the "selectedItem" string
if (item.Contains("(COM"))
{
// Get the index number where "(COM" starts in the string
int indexOfCom = item.IndexOf("(COM");
// Set PortName to COMx based on the expression in the "selectedItem" string
// It automatically gets the correct length of the COMx expression to make sure
// that also a COM10, COM11 and so on is working properly.
serialPort1.PortName = item.Substring(indexOfCom + 1, item.Length - indexOfCom - 2);
}
else
return;
}
[参考这个解决方案(https://*.com/a/2876126) –
THX的答案,但是这一次也仅适用于“真实的”物理COM端口的其他三个虚拟端口获得忽略。 –
我会去在Windows注册表中搜索。这些信息必须在那里。 – Oscar