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

программный доступ к перечню устройств (портов)

Доброго времени суток, коллеги!

 

Возникла проблемка:

На компьютер (ОС Windows) устанавливаются дополнительные устройства (через мосты USB - UART)

В частности используется микросхема CP2103. Настройка->Панель управления -> система показывает

среди портов COM и LPT : "CP210x USB to UART Bridge Controller (COM3)". Если перед этим поставить ещё какие-либо виртуальные COM порты (например GPRS модем через мобилку), либо воткнуть в другой USB порт, то будет уже не COM3, а другой номер.

 

Как программно определить, на какой COM порт стал этот мост?

(где программно найти указанную строку? - операционная система же её где-то хранит...)

 

Попытку открывать все порты подряд и слать какую-то сигнатуру прошу не предлагать.

 

Спасибо.

Изменено пользователем Ioann

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


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

Если известны VendorID и DeviceID устройства (CP210x USB to UART Bridge Controller) то можно пройтись по всем портам, найти родительское устройство и сравнить VendorID и DeviceID с нужными. Нужные функции здесь - http://msdn2.microsoft.com/en-us/library/ms790838.aspx

 

А вот пример реализации http://forums.microsoft.com/MSDN/ShowPost....63&SiteID=1

Правда, на VB, но все довольно понятно :)

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


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

Если известны VendorID и DeviceID устройства (CP210x USB to UART Bridge Controller) то можно пройтись по всем портам, найти родительское устройство и сравнить VendorID и DeviceID с нужными. Нужные функции здесь - http://msdn2.microsoft.com/en-us/library/ms790838.aspx

 

А вот пример реализации http://forums.microsoft.com/MSDN/ShowPost....63&SiteID=1

Правда, на VB, но все довольно понятно :)

 

Совершенно верно. Этот способ отлично работает - мы делали программу для конвертеров FTDI на C++.

 

Однако далее столкнулись с определенными проблемами. Как определить номера портов, если к в изделии два таких конвертера, или же к компьютеру подключены два или более разных устройств с одинаковыми VID и PID?

 

Первая мысль - присвоить собственный PID. Фирма FTDI выделила нам блок из восьми PID, и мы вставили их в драйвер (в inf-файлы) для Win98/2000/XP. Также, фирма FTDI выпустила новую версию драйвера для Mac OS X, куда были вписаны наши идентификаторы.

 

Фирме - большое спасибо, однако вскоре вышла Windows Vista. Чтобы исправленный драйвер заработал с этой OS, его нужно сертифицировать в Микрософте - а этого не хотелось бы делать по нескольким причинам.

 

Возникла идея - нельзя ли исправить только название изделия в Flash-памяти, подключенной к конвертеру, оставив VID и PID старыми. Оказалось, при просмотре дерева устройств (функциями SetupDiXXXXX) родительский элемент COM-порта имеет свойство Location с названием, соответствующим прописанному нами в Flash-памями имени (например, "My Device").

 

Однако в Windows Vista вместо этого имени выводится что-то типа "Port_#0002.Hub_#0001". Естественно, определить принадлежность COM-порта нашему устройству не представляется возможными. :-(

 

(Это все можно проверить, заглянув в Device Manager.)

 

Пришлось идти дальше. Сканировать дерево USB-устройств (по типу программы USBView, DeviceIoControl начиная от Root Hub) и находить то, чей дескриптор названия равен нашему "My Device". У этого устройства можно спросить такой параметр, как Driver Key. Такое же значение Driver Key должно быть у родительского элемента COM-порта (из списка устройств, полученных функциями SetupDiXXXX). Таким образом, получаем соответствие COM-порта и нашего устройства.

 

При необходимости в Flash-память можно зашить серийный номер и получить таблицу COM-портов и серийных номеров устройств, подключенных к ним.

 

Может быть, можно сделать все это проще?

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


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

По логике, если нужно различать два одинаковых устройства, то у них должны быть разные VID и PID, да. С другой стороны, достать название из Flash-памяти проще и отпадает необходимость покупать PID :)

C Вистой не работал, поэтому не знаю, можно ли как нибудь получить это имя через родителя; вполне возможно что да. Только способ этот будет не намного проще описанного Вами, имхо.

А без сертификации драйвера обойтись сложно, - не дебажным же ключом подписывать его.

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


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

Спасибо за ответы, смотрел я пример, что указал vshemm, но если честно, то почти ничего не понял...

 

Попробовал воспользоваться функциями SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces и SetupDiGetDeviceInterfaceDetail так:

 

HDEVINFO info;

SP_DEVINFO_DATA DeviceInfoData;

SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;

SP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;

CString a;

info = SetupDiGetClassDevs(NULL,NULL,NULL,DIGCF_ALLCLASSES);

SetupDiEnumDeviceInterfaces(info, &DeviceInfoData, NULL, NULL, &DeviceInterfaceData);

SetupDiGetDeviceInterfaceDetail(info, &DeviceInterfaceData, NULL, NULL, NULL, &DeviceInfoData);

 

на функцию CM_Get_Device_ID ругается Undeclared identifier... - во!

 

#include <setupapi.h> сделал, библиотеку setupapi.lib подключил.

в SetupDiGetClassDevs я не понял с параметром _GUID и сделал его NULL

не ясны также и другие параметры... А САМОЕ ГЛАВНОЕ - КАК получить от-туда строку типа "CP210x..."

 

Обясните, мне непонятливому...

Буду очень благодарен.

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


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

в SetupDiGetClassDevs я не понял с параметром _GUID и сделал его NULL

не ясны также и другие параметры...

 

Разбирайтесь! В интернете много исходников не подобные темы, например - EnumDevices: http://www.codeproject.com/KB/system/EnumDevices.aspx

 

А САМОЕ ГЛАВНОЕ - КАК получить от-туда строку типа "CP210x..."

 

А нужно ли получать эту строку? В программе на VB сперва сравнивают VID и PID, а если совпадут с нужными - читают номер порта (строку "COMxx") из соответствующей записи в реестре.

Изменено пользователем DenisN

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


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

Разобрался, как это делается под Windows2000 - XP, спасибо, ссылки на проекты помогли очень.

Остался один небольшой момент - как это делалось под Windows 9x - если кто знает - просьба написать в личку или на [email protected].

 

Вообще - всем спасибо, тему можно закрыть.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...