c# - 使用 VID 和 PID 识别连接到 x64 的 USB 设备的 COM 端口

标签 c# usb 64-bit usbserial

如下所示,通过给定的 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/

相关文章:

c# - 反转字符串的最佳方法

c# - 插入到 SQL Server 中的父子表中

ios - 无法在 Windows 8.1 上枚举设备错误

ios - 将 Google Cast SDK 添加到 64 位版本

c# - 我可以进一步优化我的正则表达式吗?或者我做得对吗?

linux - Docker 中的 Usbip

linux - 如何在 Linux 2.6.37 的设备端检测 USB 电缆何时连接/断开连接?

performance - x86 和 x64 中的非托管到托管互操作性能

64-bit - 64 位 visio 上不支持无窗口 ActiveX 控件异常(exception)

c# - 如何获得名称未知的 DbEntityEntry EntityKey 对象