[an error occurred while processing this directive]
|
я включаю эхо обяхательно. При приеме ловлю строку "AT" после этого все
данные начинаю складывать в буфер. После AT начинаю искать первый enter.
Как найду значит эхо получил - сравниваю с тем, что отправлял (по CRC16).
Удаляю из буфера эхо.
Далее опять принимаю данные в буфер и после каждой принятой порции
данных ищу в буфере OK,CME ERROR, CONNECT, NO CARRIER и т.д. как
только какая то из этих строк найдена, начинаю разбор данных
от начала буфера до этой конечной строчки, а именно:
ищу в этом буфере строки ответов на все поддерживаемые моим ПО
команды, в цикле.
if (FIND("+CPMS:")) {
/////
процедура парсинга CPMS
}
else
if (FIND("+CMGR:")) {
/////
процедура парсинга CMGR
}
else
if (FIND("+CPAS:")) {
/////
процедура парсинга CPAS
}
else
if (FIND("+CREG:")) {
процедура парсинга CREG
}
else {
ERROR
}
например нужно парсировать такую строку:
+CGDCONT: 1,"IP","internet.beeline.ru","",0,0
- найти строку "+CGDCONT:"
- считать 1
- убедиться что втрой параметр это IP
- и т.д
это все парсинг. Теперь что каается "системы"
каждая команда у меня послыается максимум 3 раза.
С интервалами, например, 3 сек.
Если в течении 3 попыток я не получил всех флагов
правильности приема (эхо, валидный ответ и т.д.)
я переключаю питание модема.
Есть еще такие команды которым повторный ввод в случае
не получения результата при 1 вводе не желателен
(например открытие GPRS или IP сессии) в этом случае
я посылаю команду опроса состояния для данных команд
(у каждого модема они должны быть) например типа VIEW STATE
и по их результатам принимаю решения, но это индивидуально все.
Есть еще момент, что даже на стандартные AT команды разные модемы
отвечаю по разному, например, AT+CPIN: толи GR47 толи 2406 не добавляет
в конце OK а другой добавляет. Тут уже приходится извращаться т.е.
в список концевиков (OK,CONNECT,NO CARRIER добавлять строку +CPIN:)
Еще момент, не все команды возвращают тип ответа (+CPAS:,+CREG: и т.д.)
например команда запроса IMEI модема возвращает просто строку-число без всяких
признаков что это за ответ. В этом случае я поступаю так.
Если ни одна строка-ответ не найдена и т.к. я знаю какую команду я посылал
то однозначно я определяю что это ответ на запрос IMEI и т.д.
вобщем процедура парсинга у меня получилоась довольна объемистая
но зато поддержка новой команды осуществляется в легкую
немного сумбурно, но примерно так.
E-mail: info@telesys.ru