1

我正在寻找 ansi c/c++ 中的示例代码,它将通过它们的 pid/vid/sn# 找到 USB 设备,然后找到相关的 comport 号。我有多个连接到 pc 的 FTDI usb 串行端口,需要通过已知的 SN# 识别每个端口。我找到的这段代码将显示 HWID 信息,但我如何使用它来获取 comport 号?以下是对其中一个设备的以下代码的响应: 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;    
   }
4

1 回答 1

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仅查找串行端口。

于 2020-02-18T20:01:04.213 回答