Как я понял, после того как придёт 0x0a можно читать...07.01.04 12:55 Число просмотров: 1279 Автор: CrazyPitbull Статус: Незарегистрированный пользователь
Как я понял, после того как придёт 0x0a можно читать результат выполнения команды, а до этого времени типо ждём??? Одним словом после того как послал команду жду символ перевода строки и читаю результат?
Послал в СОМ порт команду модему, и жду время пока она выполниться... как точно узнать время выполнения команды??? Ставить задержку как-то неприкольно, наверное есть какой-нить способ, если есть, поделитесь!
Hayes-compatible модем должен дать ответ в течение 3 сек06.01.04 10:09 Автор: leo <Леонид Юрьев> Статус: Elderman
> Послал в СОМ порт команду модему, и жду время пока она > выполниться... как точно узнать время выполнения команды??? > Ставить задержку как-то неприкольно, наверное есть > какой-нить способ, если есть, поделитесь! И работа с COM-портом в OVERLAPPED режиме. Примеры есть в MSDN. На форуме уже обсуждалось вроде.
Еще можешь (вместе с таймаутами, а не вместо них) поставить с помощью SetCommState поле EvtChar структуры DCB в 0x0a (возврат каретки), потом SetCommMask на EV_RXFLAG и ждать прибытия этого символа (WaitCommEvent). А только потом делать ReadFile из порта. Основано на том, что каждая команда заканчивается вводом (который шлет в терминал символ 0a).
Как я понял, после того как придёт 0x0a можно читать...07.01.04 12:55 Автор: CrazyPitbull Статус: Незарегистрированный пользователь
Как я понял, после того как придёт 0x0a можно читать результат выполнения команды, а до этого времени типо ждём??? Одним словом после того как послал команду жду символ перевода строки и читаю результат?
А ты жди ответа от модема07.01.04 13:21 Автор: Killer{R} <Dmitry> Статус: Elderman
Модем отвечает на команды в основном OK или ERROR. Вот отправляешь ему команду и ждешь пока он что нибудь ответит. Если команда - не дозвон и не отправка голосового потока ставишь к примеру таймаут 5 сек и если ответ не пришел - ругаешься юзеру что modem failure. Если дозвон - то таймаут побольше. Но вообще по вкусу. Далее учти что обычно по дефолту модемы делают эхо на твои команды. То есть выглядит это примерно так:
ТЫ : ATZ\xD\xA
MODEM:ATZ\xD\xA\xDOK\xD\xA
Эхо отключается командой ATE0
Мне нужно точно определить время выполнения той или иной команды.. То, что приходит ОК если команда успешно, это понятно, но это в конце рузультата, мнеж нужно определить то время которое пройдёт прежде чем можно будет читать данные из порта!!!!
Лучше всего: ставь таймаут и ожидай события08.01.04 23:51 Автор: amirul <Serge> Статус: The Elderman
> Мне нужно точно определить время выполнения той или иной > команды.. То, что приходит ОК если команда успешно, это > понятно, но это в конце рузультата, мнеж нужно определить > то время которое пройдёт прежде чем можно будет читать > данные из порта!!!! Как уже и было сказано. Таймаут уже не важно какой (SetCommTimeouts немного из другой оперы, для установки таймаута на WaitCommEvent придется ставить SetTimer), можешь даже конфигурируемым сделать (так лучше всего). Команды как уже сказано заканчиваются CRLF-ом, но поставить в качестве флага можно только один символ, посему ставь LF. Да, тут сделали замечание, о котором я забыл, по умолчанию, если не ошибаюсь, у модемов включена локальная эха. Или отключай ее или жди двух флагов. Если флаг не пришел до определнного таймаута - ошибка (даже если в порту есть данные, то это вряд ли ответ модема), если пришел - читай данные (но если ты ставил маску на несколько событий - проверяй какое сработало). Если сработало EV_RXFLAG - можешь читать сразу же. Данные уже в буфере и именно столько сколько надо. Просто выделяешь буфер побольше, ставишь (SetCommTimeouts) таймайты для RIT, RTTM, RTTC в MAXDWORD, 0, 0 соответственно и выполняешь ReadFile
А зачем?08.01.04 23:10 Автор: Killer{R} <Dmitry> Статус: Elderman Отредактировано 08.01.04 23:13 Количество правок: 1
> Мне нужно точно определить время выполнения той или иной > команды.. То, что приходит ОК если команда успешно, это > понятно, но это в конце рузультата, мнеж нужно определить > то время которое пройдёт прежде чем можно будет читать > данные из порта!!!! Зачем те это время нужно? Есть два вариант - делать периодический опрос порта на предмет наличия новых данных или юзать Overlapped режим, создавать дополнитенльный поток и ожидать в нем прихода новых данных (или проверять наличие данных по OVERLAPPED структуре в основном потоке когда твоей проге захочется узнать). Точного времени выполнения команд и прихода ответа от них предсказать никак нельзя. Ниче страшного не случится если твоя программа попытается прочитать данные из порта когда их там нет. В этом случае в зависимости от SetCommTimeouts она или зависнет на неопределенное время пока придут данные или подождет данных и прочитает их если они есть или вернется без данных.