2013-10-28 6 views
2

У меня есть множество устройств VCOM (FTDI, CP210x и т. Д.), С которыми моя программа взаимодействует, но мне нужно подтвердить, что они на самом деле являются этими устройствами, прежде чем я начну с ними разговаривать. Библиотека DDIXX FTDI позволяет мне связывать строки Product/Serial с номером COM, но мне действительно нужно общее решение.Как я могу получить дескрипторы строки USB для устройств VCOM (Windows)?

Чтобы быть ясным, мне нужны дескрипторы строки USB для Product, Serial и Ideal Manufacturer. Обратите внимание, что это не так же, как номера VID/PID, но фактические строки. Это нормально, если мне нужно сначала получить строки, а затем выяснить номер COM для нее позже.

Я работаю с добрым старым C, скомпилированным с использованием MingW, но на самом деле я нахожусь в такой потере, как это сделать, что решение на любом языке станет шагом вперед.

ответ

2

Вы должны ознакомиться с образцами набора драйверов Windows или просмотреть функции SetupDi (они позволяют перечислять типы устройств и запрашивать информацию). Эти функции описаны здесь: http://msdn.microsoft.com/en-us/library/windows/hardware/ff553567(v=vs.85).aspx#ddk_setupdi_device_interface_functions_dg

Я также отправил это несколько раз, но это хороший пример кода:

Посмотрите на образец USBView в WDK. Если вы не знакомы с этим, просто запустите его - этот инструмент просматривает все дерево USB в системе и распечатывает информацию и списки дескрипторов для каждого устройства.

В вашем случае я бы начал с функции RefreshTree() в этом примере, затем вы можете следовать этому коде, чтобы узнать, как он перечисляет устройства. Для каждого найденного устройства вы можете посмотреть на дескрипторы строк.

Самый простой способ получить источник для этого образца для установки 7.1.0 WDK, который в настоящее время доступен здесь: http://www.microsoft.com/en-us/download/details.aspx?id=11800

После того, как у вас есть VID/PID/серийный номер вы должны быть в состоянии смотреть номер порта в реестре. Например, номер порта CP210x будет расположен по адресу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_10C4&PID_EA60\0001\Device Parameters\Port Name в виде «COMxx» (где VID = 10C4, PID = EA60, serial = 0001). Если вы знаете, что VID/PID для вашего устройства, вы можете пропустить поиск USB и просто проанализировать через реестр, чтобы все устройства этого типа могли обнаружить их номера COM-портов.

Вы также можете получить список всех COM-портов в системе здесь: HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM. Значения будут перечислены в соответствии с их типом, поэтому реальный последовательный порт будет отображаться с именем \Device\Serialn и данными COMxx, CP210x будет отображаться с именем \Device\Silabsern и данными COMyy и т. Д. Вы можете использовать это имя для фильтрации того типа к которому принадлежит COM-порт.

+0

Кроме того, он должен попытаться также использовать идентификатор класса/подкласса, эта статья является хорошим прозрением: http: //www.lvr.com/usb_virtual_com_port.htm – garzanti

+0

Я потратил часы, пытаясь найти способ использовать SetupDi для этого, и вышел не лучше, чем я начал, поэтому просил StackOverflow. USBView отображает всю информацию USB просто отлично, но ничего, что могло бы помочь мне определить, какие VCOM-порты являются устройством. –

+0

Я обновил ответ и добавил строку, которая показывает, как вы можете получить номер COM-порта, когда у вас есть информация о подключенном устройстве, это больше того, что вы ищете? – Preston

1

Дескриптор строки продукта отображается через SetupDi.

В Windows 7 и более поздних версиях оно называется «Описание устройства с сообщением о шине». В XP и 2000 он был в свойстве «Местоположение». Кажется, он не доступен в Vista.

Другие дескрипторы строк, как вы заметили, доступны только с помощью команд USB ioctl, отправленных в верхнее концентраторное устройство, без программного способа их корреляции.

Серийные номера доступны в обоих направлениях, и могут быть ключом к их согласованию.