Поиск номеров портов USB с помощью VID, PID, + SN - PullRequest
1 голос
/ 14 февраля 2020

Я ищу пример кода в ansi c / c ++, который найдет USB-устройства по их pid / vid / sn #, а затем найдет соответствующий номер компорта. У меня есть несколько последовательных USB-портов FTDI, подключенных к ap c, и мне нужно идентифицировать каждый порт по известному 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;    
   }

1 Ответ

0 голосов
/ 18 февраля 2020

Если вам нужно понятное имя, которое обычно включает заключенный в скобки номер 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_list и device_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, чтобы найти только последовательные порты.

...