如下所示,通过给定的 pid 和 vid,我能够获得连接到 32 位 win7OS 机器的 USB com 端口名称,但是在 x64 中运行时,它停留在以下行中:
comports.Add((string)rk6.GetValue("PortName"));
这是我的代码
static List<string> ComPortNames(String VID, String PID)
{
String pattern = String.Format("^VID_{0}.PID_{1}", VID, PID);
Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase);
List<string> comports = new List<string>();
RegistryKey rk1 = Registry.LocalMachine;
RegistryKey rk2 = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum");
foreach (String s3 in rk2.GetSubKeyNames())
{
RegistryKey rk3 = rk2.OpenSubKey(s3);
foreach (String s in rk3.GetSubKeyNames())
{
if (_rx.Match(s).Success)
{
RegistryKey rk4 = rk3.OpenSubKey(s);
foreach (String s2 in rk4.GetSubKeyNames())
{
RegistryKey rk5 = rk4.OpenSubKey(s2);
RegistryKey rk6 = rk5.OpenSubKey("Device Parameters");
comports.Add((string)rk6.GetValue("PortName"));
}
}
}
}
return comports;
}
实际代码获取here ,那么如何在 x64 中获取 com 端口名称,有什么建议吗?
最佳答案
当我测试来自 Youkko 的答案时在 Windows 10 x64 下,我得到了一些奇怪的结果,并查看了我机器上的注册表,LocationInformation
键包含诸如 Port_#0002.Hub_#0003
之类的字符串,因此它们是相关的到设备连接的 USB 集线器/端口,而不是 Windows 分配的 COM 端口。
所以在我的例子中,我得到了 COM2,它是我主板上的一个硬件端口,它跳过了我期望的 COM5 端口,但它位于 PortName
注册表项下。我不确定自您使用的 Windows 版本以来是否发生了某些变化,但我认为您的主要问题可能是没有检查键上的空值。
以下稍作修改的版本似乎在各种或 Windows 7/10 和 x32/64 系统上运行良好,我还添加了一个检查 SerialPort.GetPortNames()
以确保设备可用并在归还之前插入系统:
static List<string> ComPortNames(String VID, String PID)
{
String pattern = String.Format("^VID_{0}.PID_{1}", VID, PID);
Regex _rx = new Regex(pattern, RegexOptions.IgnoreCase);
List<string> comports = new List<string>();
RegistryKey rk1 = Registry.LocalMachine;
RegistryKey rk2 = rk1.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum");
foreach (String s3 in rk2.GetSubKeyNames())
{
RegistryKey rk3 = rk2.OpenSubKey(s3);
foreach (String s in rk3.GetSubKeyNames())
{
if (_rx.Match(s).Success)
{
RegistryKey rk4 = rk3.OpenSubKey(s);
foreach (String s2 in rk4.GetSubKeyNames())
{
RegistryKey rk5 = rk4.OpenSubKey(s2);
string location = (string)rk5.GetValue("LocationInformation");
RegistryKey rk6 = rk5.OpenSubKey("Device Parameters");
string portName = (string)rk6.GetValue("PortName");
if (!String.IsNullOrEmpty(portName) && SerialPort.GetPortNames().Contains(portName))
comports.Add((string)rk6.GetValue("PortName"));
}
}
}
}
return comports;
}
关于c# - 使用 VID 和 PID 识别连接到 x64 的 USB 设备的 COM 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350340/