【问题标题】:How to distinguish between usb-serial converters?如何区分usb-serial转换器?
【发布时间】:2011-09-09 20:32:02
【问题描述】:

我有 4 个 USB 串行转换器 (Prolific) 连接到 USB 集线器。当我查看设备管理器时,我会看到动态分配的 Com 编号。但是在将集线器重新插入另一个 USB 端口或系统 reebot 之后,这些 com 编号有时会发生变化。有没有办法在不手动搜索这些数字的情况下为每个转换器更新这些数字?基本上我想在我的 C# 项目中有一个方法,它会为每个转换器寻找一些唯一的 id,然后获取新的 com 号。有没有办法做到这一点(尝试了一些 wmi 查询但没有成功)?

今天我想了一个解决方法。所以我有另一个问题。如何获取有关 USB 集线器的信息?基本上我可以以某种方式找到我的 USB 集线器,然后检索有关连接到集线器端口设备的信息。然后通过 wmi 查询获取这些设备的 com 号将非常容易。我使用 USBView 来查看是否可以获得此类信息。我可以看到从 Root Hub -> Generic USB Hub -> Prolific USB-to-serial Comm Port 开始的树,但是现在如何在代码中执行此操作。有什么想法吗?

【问题讨论】:

  • 不,USB 是总线,它不显示端口号。是的,当你在测试(不是在生产中)时,这是一个痛苦的问题。除了将它们一个接一个地插入并在代码中观察 SerialPort.GetPortNames() 之外,您无能为力。拥有一种从设备数据中识别物理设备的方法是最好的解决方案。
  • 我不记得很多细节了,但是创建的每个端口都有一个关联的注册表项(位置取决于 USB 串行芯片的制造商),您应该能够通过它来区分它们。
  • 为了避免这个问题,我改用 Moxa 8 端口 PCI 串口卡。

标签: c#


【解决方案1】:

很简单,使用win32原生调用就可以搞定,

我只是提供了一部分代码,来帮助你,

var guidComPorts = Guid.Empty;
        UInt32 dwSize;
        IntPtr hDeviceInfo;
        var buffer = new byte[512];
        var providerName = new[] { };
        var spddDeviceInfo = new SpDevinfoData();
        var bStatus = SetupDiClassGuidsFromName("Ports", ref guidComPorts, 1, out dwSize);
        if (bStatus)
        {
            hDeviceInfo = SetupDiGetClassDevs(
                ref guidComPorts,
                (IntPtr)null,
                (IntPtr)null,
                DigcfPresent | DigcfProfile);
            if (hDeviceInfo.ToInt32() != 0)
            {

                while (true)
                {
                    spddDeviceInfo.CbSize = Marshal.SizeOf(spddDeviceInfo);// IS IT THIS LINE WORK FOR 64 BIT                        
                    bStatus = SetupDiEnumDeviceInfo(hDeviceInfo, nDevice++, ref spddDeviceInfo);
                    break;
                }

            }


            return;
        }

    }

使用此代码...

查找友好名称,拆分字符串获取您要查找的确切端口。 我已经完成了,由于某些保密原因无法在此处提供完整代码,它工作正常。

欲了解更多信息,请查找此链接

http://www.codeproject.com/KB/cs/HardwareHelper.aspx

【讨论】:

  • 好的,谢谢您的回复。 @arun 我使用了 win32 api 调用并基于我在网上找到的 USBView c# 代码。这非常有帮助,因为我是 win32 api 的新手(你的样本很有动力;))。相当多的代码,但它现在可以按照我的意愿运行。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多