c++ - 使用VID,PID和SN查找USB端口号

标签 c++ c cvi

我正在寻找ansi c / c++中的示例代码,这些代码将通过其pid / vid / sn#找到USB设备,然后找到相关的端口号。我有多个连接到PC的FTDI USB串行端口,需要通过已知的SN#识别每个端口。我找到的这段代码将显示HWID信息,但是如何使用它来获取电话号码?这是对其中一种设备的以下代码的响应:USB \ VID_0403&PID_6001 \ FTAME7HK
是否有在线教程,其中包含此类代码的示例?

    #include <windows.h> 
    #include <ansi_c.h>
    #include <Setupapi.h>
    #include <devguid.h>
    #include <Setupapi.h>
    HDEVINFO deviceInfoSet;
    GUID *guidDev = (GUID*) &GUID_DEVCLASS_USB; 
    TCHAR buffer [4000];
    DWORD buffersize =4000;
    int memberIndex = 0;
    main()
    {
    deviceInfoSet = SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE);   
    while (TRUE) {
    SP_DEVINFO_DATA deviceInfoData;
    ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA));
    deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    if (SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex, &deviceInfoData) == FALSE) {
      if (GetLastError() == ERROR_NO_MORE_ITEMS)
        {
        break;
        }
   }
   DWORD nSize=0 ;
   SetupDiGetDeviceInstanceId (deviceInfoSet, &deviceInfoData, buffer, sizeof(buffer), &nSize);
   buffer [nSize] ='\0';
   printf ("%s\n", buffer);
   memberIndex++;
   }
   if (deviceInfoSet) {
   SetupDiDestroyDeviceInfoList(deviceInfoSet);
   }
   getchar();
   return 0;    
   }

最佳答案

如果要使用友好名称(通常包含带括号的com端口号),则应这样做:

{
    wchar_t friendly_name[128];
    if (!SetupDiGetDeviceRegistryPropertyW(device_list, &device_data, SPDRP_FRIENDLYNAME, nullptr, reinterpret_cast<PBYTE>(friendly_name), sizeof friendly_name, nullptr))
        return;
    StringCopyW(buffer, friendly_name);
}

为了获得上述调用的两个参数device_listdevice_data,我使用以下函数:
void rescan_ports( void )
{
    SP_DEVINFO_DATA device_data = { sizeof device_data };
    HDEVINFO device_list = SetupDiGetClassDevsW(&GUID_DEVINTERFACE_COMPORT, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
    DWORD error = GetLastError();
    if (!device_list && device_list == INVALID_HANDLE_VALUE) return;

    bool ended = false;
    for( int i = 0; i < 6000 && !ended; i++ ) {
        if (SetupDiEnumDeviceInfo(device_list, i, &device_data))
            format_and_add_port_detail(device_list, device_data);
        else
            ended = (GetLastError() == ERROR_NO_MORE_ITEMS);
    }

    SetupDiDestroyDeviceInfoList(device_list);
}

它和您写的非常相似,除了我的使用GUID_DEVINTERFACE_COMPORT仅查找串行端口。

关于c++ - 使用VID,PID和SN查找USB端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60232863/

相关文章:

c - 使用 NI VISION imaqDetectLines() 函数时出现一般保护错误

c++ - 将 vector 复制到队列中

c - 您如何获得具有 HID 的复合 USB Linux 设备来唤醒挂起的主机?

c - 从字符串数组中删除字符串 (C)

c99 __restrict 和编译器优化

c++ - 动画管理器设计模式?

c++ - 一个对象被销毁后,标量类型的子对象会发生什么?

c++ - 唯一指针类内初始化

c - 在 C 中打印 SQL