Идентификация устройства подключенного к СОМ порту
Я сейчас пишу софт для работы со своим устройством. На данный момент моя программа может найти и отобразить в ListBox список СОМ портов, к которе открыты. Как получить имя самого устройства подключенного к порту? Например, как на рисунке(MaxStream PKG-U):
Собственно причём здесь Ц++, тем более визуальный? ;-)
Ответы большинства модемов таковы:
Цитата:
I0 Reports product code, e.g., 56000
I1 Reports the least significant byte of the stored checksum in decimal (see
firmware release notes).
Reports 255 if the prestored checksum value is FFh.
I2 Reports "OK".
I3 Reports identification codes in the form M_VX.X-F_A where:
M = Basic model (i.e., V90, K56, or V34)
VX.X = Firmware version (e.g., V2.060)
F = Firmware model and ROM Size:
V90, K56, or V34 = V90, K56, or V34 in 1M ROM
V90_2M, K56_2M, or V34_2M = V90, K56, or V34 in 2M ROM
A = Application
DLS = Desktop serial
DLP = Desktop parallel
DLL = Low Power PC Card
DL3 = Low Power 3V
DLG = Low Power World Class
Example: K56_V2.060-K56_2M_DLS
I4 Reports OEM defined identifier string in either Hayes-compatible binary
format (default) or ASCII format
(selectable by ConfigurACE), e.g.:
a007840284C6002F
bC60000000
r1005111151012000
r3000111170000000
I5 Reports Country Code parameter (see NCn command), e.g., 022
I6 Reports modem data pump model and internal code revision, e.g.,
RCV56DPF L8570A Rev 47.12/47.12
I1 Reports the least significant byte of the stored checksum in decimal (see
firmware release notes).
Reports 255 if the prestored checksum value is FFh.
I2 Reports "OK".
I3 Reports identification codes in the form M_VX.X-F_A where:
M = Basic model (i.e., V90, K56, or V34)
VX.X = Firmware version (e.g., V2.060)
F = Firmware model and ROM Size:
V90, K56, or V34 = V90, K56, or V34 in 1M ROM
V90_2M, K56_2M, or V34_2M = V90, K56, or V34 in 2M ROM
A = Application
DLS = Desktop serial
DLP = Desktop parallel
DLL = Low Power PC Card
DL3 = Low Power 3V
DLG = Low Power World Class
Example: K56_V2.060-K56_2M_DLS
I4 Reports OEM defined identifier string in either Hayes-compatible binary
format (default) or ASCII format
(selectable by ConfigurACE), e.g.:
a007840284C6002F
bC60000000
r1005111151012000
r3000111170000000
I5 Reports Country Code parameter (see NCn command), e.g., 022
I6 Reports modem data pump model and internal code revision, e.g.,
RCV56DPF L8570A Rev 47.12/47.12
Цитата: Vov4ick
Дать устройству команды ATI0 ... ATI7 и посмотреть ответы на каждую. Ответы на 0, 3 и 4 команды и используются для определения устройства.
Собственно причём здесь Ц++, тем более визуальный? ;-)
Ответы большинства модемов таковы:
Собственно причём здесь Ц++, тем более визуальный? ;-)
Ответы большинства модемов таковы:
Спасибо, но это не то! Вот то, что мне надо :http://www.ftdichip.com/Support/Knowledgebase/ftid_getdevicedescription.htm
С++ здесь притом, что я пишу программу, которая должна распознавать устройства подключенные к СОМ портам (виртуальним и реальным).
Эта библиотека скорее всего делает то, что я написал.
И информацию об устройстве, подключенном к COM порту(виртуальному или реальному), можно получить исключительно АТ коммандами.
Слушай а если несложно, как ты определял открытые порты? просто брал порт, отсылал ему at-команду, и если порт отвечал-то открыт?
А венда не даст просто открыть порт, если он уже кем-то открыт. К тому же перет общением с устройством, подключенным к порту нужно проверять готовность как порта, так и устройства.
Я немного не про то. Допустим, у нас есть несколько com-портов. И мне нужно проверить, к какому из них подключен модем. Последовательно открываю каждый из них createfile'ом, потом проверяю-если он открыт, значит к ком-порту что то подключено. Но как понять, что именно. Ведь похоже, что у каждого компьютера 1-ый(а иногда и 2-ой) порт задействован(последовательный порт). Отсылкой at-команды? просто если данное устройство не является модемом, то программа просто виснет, дожидаясь ответа.
Может по DOS-имени можно будет разобраться? Например функция QueryDosDevice("COM1", DosName, MAX_PATH); может вернуть вернуть в строку DosName более интересное значение, чем просто "COM1" (если он конечно есть).
Нужно по очереди для каждого порта проверять готовность порта, готовность устройства, затем командами I3, I4 попытаться узнать, что это такое.
Цитата: Vov4ick
QueryDosDevice вернёт что-то вроде \device\serial1
Это для стандартных COM-портов. А для всяких
устройств типа MaxStream PKG-U или адаптеров USB-COM там будет что-то другое, вписанное разработчиком ПО при установке драйвера. А если нет порта, то вроде бы пустую строку должен возвратить.
Кстати ещё тогда довольно ламерский вопрос по этой теме. Читаю сообщения с порта с помощью ReadFile. Так вот, если сообщения нету или уже все прочитано, то readfile ждет следующего символа-то есть программа зависает. Как можно обойти эту проблему, чтобы если прочитать нечего, прога не ждала следующего символа, а переходила дальше
выставить таймауты на чтение или читать асинхронно.
to Karrde: параметр cbInQue структуры COMSTAT может помочь.
А также Get\SetCommMask и Get\SetCommState.
Также можно использовать асинхронную работу с устройствами, но это будет несколько сложнее.