|
Есть ли классика обработки ответов от GSM модуля на стороне МК ?, Асинхронный режим, без контроля потока |
|
|
|
Mar 17 2013, 10:04
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 18-02-13
Из: Киев
Пользователь №: 75 678

|
Задался вопросом, а существует ли классический алгоритм обработки ответов модуля на стороне микроконтроллера? Лично я пробую обрабатывать на лету: Временный буфер (50 байт, например), он до начала приема заполнен значениями 0А, это для обработки двух-символьных ответов 30 0D и 34 0D. Указатель - переменная на последний принятый байт в буфере, по умолчанию = 1. В основном цикле отправляю команду в модуль и в цикле жду изменения переменной результата. По прерыванию на UART: - пополняю временный буфер принятым байтом (пополнение начинается не с нулевого байта, а с первого, опять же, для обработки двух-символьных ответов); - если указатель >= 2, проверяю три последних символа буфера на соответствие маске (0A 30 0D, 0A 34 0D etc.); - если соответствие есть - записываю в переменную результата (соответственно 30, 31, 34 etc.); - инкрементирую указатель на последний принятый байт и опять жду прерывания.
Думал просто искать ответ во временном буфере, выдержав какую-то паузу после отправки команды в модуль, но время выполнения команд может быть очень разное... В общем, это мой дебютный алгоритм опроса модулей, по этому и задался вопросом, а как пишут бывалые?
|
|
|
|
3 страниц
< 1 2 3
|
 |
Ответов
(30 - 40)
|
Mar 22 2013, 18:13
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 18-02-13
Из: Киев
Пользователь №: 75 678

|
Цитата(zebrox) ... выставляет сигнал РТЦ. После выхода, убирает. Вы имеете ввиду RTS?
|
|
|
|
|
Mar 23 2013, 13:18
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Цитата(zebrox @ Mar 22 2013, 22:09)  Для этого, этого использую контроль потока. Процессок, перед проходом по "отправляющим" функциям, выставляет сигнал РТЦ. После выхода, убирает. Ну это скорее к отсрочке чем к отработке относится. Самое интересное это как отличить URC от ответа на команду?
|
|
|
|
|
Mar 23 2013, 17:13
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 18-02-13
Из: Киев
Пользователь №: 75 678

|
Цитата(jack_avenger @ Mar 23 2013, 15:18)  ...Самое интересное это как отличить URC от ответа на команду? По этому поводу нашел вот такую ссылку
|
|
|
|
|
Mar 23 2013, 17:52
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 17-04-09
Пользователь №: 47 838

|
Честно говоря, не совсем понимаю зачем отличать юрц от ответа. Я все строки обрабатываю по одному алгоритму, проверяю, с чего строка начинается.
Список юрц известен, просто проверяем каждую строку на начало интересующего юрц, если совпало - значит пришел юрц. Если пришел ок или еррор или еще чего, то мы же знаем, в каком состоянии находится порт==знаем какую последнюю команду отправили, соответсвенно можем и ответ обработать. К тому-же на 90% ответов можно сделать такую-же ловушку как на юрц, если строка начинается на что-то, значит это ответ.
Вот с запросом имея сложнее. В симах ответ идет без подстроки идентификатора. В этом случае шлю запрос имей, перевожу порт в состояние чтения имея, приходит строка, вижу, что порт в состоянии чтения имея, проверяю строку на длинну, если 15, и только цифры, то пришел имей, записываю его, отпускаю порт.
|
|
|
|
|
Mar 23 2013, 18:32
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Цитата(vassabi @ Mar 23 2013, 21:13)  По этому поводу нашел вот такую ссылкуСпасибо. У меня на том же принципе все построено (эхо включено и анализирую эхо команды). Из плюсов получаю на выходе TX модема следить за командами и ответами. Но вот гарантированно ли URC не вклинивается между эхом команды и результатом ее выполнения нигде в документах не нашел. Цитата(zebrox @ Mar 23 2013, 21:52)  Честно говоря, не совсем понимаю зачем отличать юрц от ответа. Я все строки обрабатываю по одному алгоритму, проверяю, с чего строка начинается. Если я правильно Вас понял то ответы у Вас парсятся обработчиком текущей команды. Так вот чтоб в каждом парсере не вылавливать все возможные URC и пригодилось бы всегда знать что мы получили: результат выполнения команды или URC. Цитата(zebrox @ Mar 23 2013, 21:52)  Список юрц известен, просто проверяем каждую строку на начало интересующего юрц, если совпало - значит пришел юрц. Если пришел ок или еррор или еще чего, то мы же знаем, в каком состоянии находится порт==знаем какую последнюю команду отправили, соответсвенно можем и ответ обработать. К тому-же на 90% ответов можно сделать такую-же ловушку как на юрц, если строка начинается на что-то, значит это ответ. Вот с запросом имея сложнее. В симах ответ идет без подстроки идентификатора. В этом случае шлю запрос имей, перевожу порт в состояние чтения имея, приходит строка, вижу, что порт в состоянии чтения имея, проверяю строку на длинну, если 15, и только цифры, то пришел имей, записываю его, отпускаю порт. У меня такой проблемы нет. После отправки команды модему жду (с тайм-аутом) получения эха команды. После получения эха все строки до OK, ERROR , CONNECT и др. считаются результатом выполнения команды.
|
|
|
|
|
Mar 23 2013, 18:44
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 18-02-13
Из: Киев
Пользователь №: 75 678

|
Цитата(jack_avenger @ Mar 23 2013, 20:32)  Но вот гарантированно ли URC не вклинивается между эхом команды и результатом ее выполнения нигде в документах не нашел... ....После получения эха все строки до OK, ERROR , CONNECT и др. считаются результатом выполнения команды. Это легко проверить, имхо. Просим модем выполнить что нибудь долгое, типа GPRS соединения, и сразу не дожидаясь CONNECTа позвонить на него.
|
|
|
|
|
Mar 23 2013, 19:55
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 17-04-09
Пользователь №: 47 838

|
Да нет, обработчик один, на все отведы, эха, юрц. Я ж говорю, какая разница, что идет от сима, ответ, эхо или юрц. Получили строку, пропустили ее через фильтры, если какой-то сработал, обрабатываем ответ в контексте состояния порта (последней команды).
например приходит ОК В зависимости от состояния порта, вызываем тот или иной метот модуля соответствующего модуля, а он уже решит, что длеать с ним.
void ProcessOKAnswer(char who_called) { if(GL_GSM_STATES.UART_State == GSM_STATE_TIME_SYNCHRONISATOR) { TMR_ProcessAnswer(TRUE); } else if(GL_GSM_STATES.UART_State == GSM_STATE_VOICECALLREJECTING) { GSMSetUARTState(11, GSM_STATE_FREE); } else if(GL_GSM_STATES.UART_State == GSM_STATE_VOICECALLANSWERING) { GSMSetUARTState(12, GSM_STATE_VOICECALLONGOING); GLF_SetOutgoingCallTime(1, 60); } }
Для меня нет никакой разницы, что за строка пришла от модема, они все обрабатываются одиннаково и в одном месте. Если никакой фильтр не сработал на нее, ну и прекрасно, значит эта строка нас не интересует, это может быть эхо или юрц левый, что угодно. Ловим только то, что нас интересует.
|
|
|
|
|
Mar 23 2013, 19:55
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Цитата(vassabi @ Mar 23 2013, 22:44)  Это легко проверить, имхо. Просим модем выполнить что нибудь долгое, типа GPRS соединения, и сразу не дожидаясь CONNECTа позвонить на него. Проверялось, но хотелось бы убедиться в этом и документально.
|
|
|
|
|
Mar 23 2013, 23:44
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 18-02-13
Из: Киев
Пользователь №: 75 678

|
Цитата(jack_avenger @ Mar 23 2013, 21:55)  Проверялось, но хотелось бы убедиться в этом и документально. GSM 0710, Time that a station will wait for an acknowledgement before resorting to other action, 100 milliseconds
|
|
|
|
|
Mar 23 2013, 23:51
|
Частый гость
 
Группа: Свой
Сообщений: 170
Регистрация: 30-06-05
Из: Киев
Пользователь №: 6 426

|
Цитата(vassabi @ Mar 24 2013, 03:44)  GSM 0710, Time that a station will wait for an acknowledgement before resorting to other action, 100 milliseconds Думаю это что-то другое. 0710 я не использую и не планирую пока
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|