Перейти к содержанию

Можно ли в РС программе определить тип COM порта?

Железяка на STM32F407 обменивается по USB(виртуальный СОМ порт) c РС программой(Windows, Borland C++ builder). Программа идентифицирует железяку опрашивая все наличествующие в системе СОМ порты. Заранее неизвестно сколько портов и каких может быть в системе. Можно ли используя API или что либо еще, определить тип СОМ порта - виртуальный, или "железный"? Было бы идеально, если б можно было получить строку из описания порта в системе, например "PCI Serial Port(COM3)", или "STM32 Virtual Com Port (COM6) "
Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(nanorobot @ Nov 28 2016, 15:08) <{POST_SNAPBACK}>
Железяка на STM32F407 обменивается по USB(виртуальный СОМ порт) c РС программой(Windows, Borland C++ builder). Программа идентифицирует железяку опрашивая все наличествующие в системе СОМ порты. Заранее неизвестно сколько портов и каких может быть в системе. Можно ли используя API или что либо еще, определить тип СОМ порта - виртуальный, или "железный"? Было бы идеально, если б можно было получить строку из описания порта в системе, например "PCI Serial Port(COM3)", или "STM32 Virtual Com Port (COM6) "


В питоне такая возможность есть средствами serial.tools.list_ports про борланд не подскажу, но, имхо, наверняка должна быть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Самфй простой способ - посмотреть названия ключей в HKLM/HARDWARE/DEVICEMAP/SERIALCOMM. Если не устроит, гуглите setupapi.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(aaarrr @ Nov 28 2016, 15:23) <{POST_SNAPBACK}>
Самфй простой способ - посмотреть названия ключей в HKLM/HARDWARE/DEVICEMAP/SERIALCOMM. Если не устроит, гуглите setupapi.


нашел вот такой пример с использованием setup.api
Код
  HDEVINFO hDevInfo;
        SP_DEVINFO_DATA DeviceInfoData;
        SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
        char dev_name[1024];
        DWORD i;

        GUID GUID_DEVCLASS_PORTS = {0x4d36e978, 0xe325, 0x11ce, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18};

        hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
        if (hDevInfo == INVALID_HANDLE_VALUE)
        {}//    return 0;
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
        for(i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
        {
            SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, (UCHAR*)dev_name, sizeof(dev_name), NULL);
            std::cout << dev_name << std::endl;
        }
        SetupDiDestroyDeviceInfoList(hDevInfo);


все порты находит, кроме виртуального, того который и нужен ..
хотя CLASS GUID соответствует: 4D36E978-E325-11CE-BFC1-08002BE10318
Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(aaarrr @ Nov 28 2016, 16:23) <{POST_SNAPBACK}>
Самфй простой способ - посмотреть названия ключей в HKLM/HARDWARE/DEVICEMAP/SERIALCOMM. Если не устроит, гуглите setupapi.
Не надо так делать. Начиная с Windows7 это работает только под учетной записью администратора.
Цитата(nanorobot @ Nov 28 2016, 19:14) <{POST_SNAPBACK}>
нашел вот такой пример с использованием setup.api
Здесь этот код нашёл?
Чуть выше там нормальный рабочий код, который все порты находит.
[attachment=104618:COM_Ports.png]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(nanorobot @ Nov 28 2016, 15:14) <{POST_SNAPBACK}>
все порты находит, кроме виртуального, того который и нужен ..
хотя CLASS GUID соответствует: 4D36E978-E325-11CE-BFC1-08002BE10318


При вызове функции SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); надо убрать флаг DIGCF_DEVICEINTERFACE. Тогда будут получены и виртуальные порты использующие драйвер usbser.sys.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация