Ситуация: есть устройство которое коннектится либо напрямую к COM порту, либо через переходник к USB. Работа с устройством идет по протоколу COM порта (для ситуации с USB подключением используется драйвер Prolific). На компе устанавливается ПО для работы с устройством. Но когда соединение через USB то устройство подключается к заранее неизвестному порту (COM1, COM2, ... COMXXX)
Вопрос: Как правильно программно определить местонахождение устройства в системе?
По крайней мере я хочу чтобы при запуске приложения как нить опрашивать порты чтобы узнать, то ли это устройство.
Пока реализовал так:
* Спрашиваю при пуске приложения систему о имеющихся COM портах — получаю список
* Поочередно отправляю в каждый порт команду типа ХХХ жду секунду ответа YYY
* откуда получаю ответ тот порт и использую
Понимаю что так нехорошо, мало ли что в других устройсвами пожет произойти (у меня, например, модем после такой операции иногда приходится перезапускать)
Подскажите в какую сторону копать?
Система Win
PS
Устройство сами делаем это, может надо к нему чего-нить прикрутить чтобы оно себя корректно выставляло на показ?
Хорошо иметь достойных потомков, но слава принадлежит нашим предкам. (Плутарх)
Re: Поиск номера COM порта к которому устройство подключено
T>Вопрос: Как правильно программно определить местонахождение устройства в системе? T>По крайней мере я хочу чтобы при запуске приложения как нить опрашивать порты чтобы узнать, то ли это устройство.
Сталкивался с точно такой же проблемой. До общего решения так и не допетрил, бо не сильно фатально было. Приведу prolific-specific решение
T>Пока реализовал так: T>* Спрашиваю при пуске приложения систему о имеющихся COM портах — получаю список T>* Поочередно отправляю в каждый порт команду типа ХХХ жду секунду ответа YYY T>* откуда получаю ответ тот порт и использую
Опрашивать все порты чёсом — это плохое решение. При наличии в системе корявых драйверов встроенного блютуса (а в ноутбуках они с большой вероятностью будут корявыми, по-другому драйверов в фирмах типа broadcom не пишут), опрос эмулированных блютусных COM-портов будет занимать несколько МИНУТ.
T>Понимаю что так нехорошо, мало ли что в других устройсвами пожет произойти (у меня, например, модем после такой операции иногда приходится перезапускать)
Шли какую-нибудь "модемонейтральную" команду, а-ля ATI1. Ответить на неё из своего девайса можешь как угодно.
T>Подскажите в какую сторону копать?
Открой каталог реестра "HKLM\SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303", в его подкаталогах обнаружишь маппинг пролификов на номера COM-портов.
Если нет такого каталога — узнай Vid и Pid своего USB-хвоста, и ищи по ним.
Re[2]: Поиск номера COM порта к которому устройство подключе
T>>Подскажите в какую сторону копать? I>Открой каталог реестра "HKLM\SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303", в его подкаталогах обнаружишь маппинг пролификов на номера COM-портов. I>Если нет такого каталога — узнай Vid и Pid своего USB-хвоста, и ищи по ним.
Более универсальный метод:
Каталог "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E978-E325-11CE-BFC1-08002BE10318}". В его подкаталогах обнаружишь маппинг классов портов на драйверы. Анализируешь ключи InfSection и DriverDesc. Если находишь в них подстроку bluetooth, broadcom, widcomm — игнорируешь данный класс портов. В классах, прошедших отбор, по ключу MatchingDeviceId ищешь экземпляры портов ( в папке "HKLM\SYSTEM\CurrentControlSet\Enum\USB" ).
Re[3]: Поиск номера COM порта к которому устройство подключе
Здравствуйте, iiice, Вы писали:
T>>>Подскажите в какую сторону копать? I>>Открой каталог реестра "HKLM\SYSTEM\CurrentControlSet\Enum\USB\Vid_067b&Pid_2303", в его подкаталогах обнаружишь маппинг пролификов на номера COM-портов. I>>Если нет такого каталога — узнай Vid и Pid своего USB-хвоста, и ищи по ним.
I>Более универсальный метод:
I>Каталог "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E978-E325-11CE-BFC1-08002BE10318}". В его подкаталогах обнаружишь маппинг классов портов на драйверы. Анализируешь ключи InfSection и DriverDesc. Если находишь в них подстроку bluetooth, broadcom, widcomm — игнорируешь данный класс портов. В классах, прошедших отбор, по ключу MatchingDeviceId ищешь экземпляры портов ( в папке "HKLM\SYSTEM\CurrentControlSet\Enum\USB" ).
Спасибо за информацию
Хорошо иметь достойных потомков, но слава принадлежит нашим предкам. (Плутарх)