реклама на сайте
подробности

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


Частый гость
**

Группа: Свой
Сообщений: 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.);
- инкрементирую указатель на последний принятый байт и опять жду прерывания.

Думал просто искать ответ во временном буфере, выдержав какую-то паузу после отправки команды в модуль, но время выполнения команд может быть очень разное...
В общем, это мой дебютный алгоритм опроса модулей, по этому и задался вопросом, а как пишут бывалые?




Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexandrY
сообщение Mar 17 2013, 13:47
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(vassabi @ Mar 17 2013, 12:04) *
В общем, это мой дебютный алгоритм опроса модулей, по этому и задался вопросом, а как пишут бывалые?


Применяю всегда RTOS для этих целей.

В прерываниях просто записываются символы в кольцевой буфер и отправка события в задачу модема о приеме символа.

Задача модема извлекает символы из кольцевого буфера в свой линейный буфер и ищет в нем заданный при вызове функции чтения терминатор строки.
Терминатором может быть и 0D 0A или '>' или что угодно, зависит от того что в данный момент приложение ожидает от модема.
Ожидание получения строки длится определенное заданное время.
Если в течении этого времени терминатор не обнаружен, то принятый буфер данных дополнительно сканируется
на асинхронные сообщения по их строчным шаблонам и если и их не обнаружено, то буфер обнуляется.
Асинхронные сообщения могут иметь иметь каждое свою задачу назначения. Задачи приемники заранее регистрируют свои обработчики в задаче модема.
Go to the top of the page
 
+Quote Post
x893
сообщение Mar 17 2013, 14:27
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Цитата(AlexandrY @ Mar 17 2013, 17:47) *
Применяю всегда RTOS для этих целей.

В прерываниях просто записываются символы в кольцевой буфер и отправка события в задачу модема о приеме символа.

Не выгодно каждый символ передавать - я делаю по концу строки или по установленным маскам. Бинарные данные просто записываются и по счетчику передается событие и готовности.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Mar 17 2013, 18:25
Сообщение #4


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(x893 @ Mar 17 2013, 16:27) *
Не выгодно каждый символ передавать - я делаю по концу строки или по установленным маскам. Бинарные данные просто записываются и по счетчику передается событие и готовности.


Немного не понял ваш механизм, разъясните куда данные записываются, что за счетчик и каким образом передается событие.

В моем варианте из процедуры прерывания в задачу RTOS передаются не символы, а асинхронные сообщения о приеме символов.
Поскольку процедура прерывания не может посылать никакие данные, так как не знает своих задач-приемников.
Задача-приемник же может забрать и посимвольно и большим блоком в зависимости от того как она успевает.

Формировать же строки имеющие разные терминаторы в процедуре прерывания означает слишком усложнить процедуру прерывания и перенести в нее часть логики прикладного приложения.
А если учесть еще, что приходится работать и с протоколом PPP и с мультиплексированием, то вообще неприемлемо втягивать в это процедуру прерывания.

Цитата(kan35 @ Mar 17 2013, 20:00) *
Я еще не стал уподробняться, что у меня не просто прерывание по RX, а используется DMA, так как STM32...


DMA? Очень интересно.
А как вы задаете для DMA размер пересылаемого блока? На основе чего его определяете?
И почему DMA только по RX?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- vassabi   Есть ли классика обработки ответов от GSM модуля на стороне МК ?   Mar 17 2013, 10:04
- - kan35   Я сделал структуру для ответа с собственно массиво...   Mar 17 2013, 12:31
- - vassabi   ЦитатаОтсекая строки по 0D 0A... Так не все же отв...   Mar 17 2013, 13:06
|- - kan35   Цитата(vassabi @ Mar 17 2013, 17:06) Так ...   Mar 17 2013, 18:00
- - andrewlekar   Классики нет, особенно если требуется принимать да...   Mar 17 2013, 13:26
|- - kan35   Цитата(AlexandrY @ Mar 17 2013, 22:25) DM...   Mar 17 2013, 19:03
- - vassabi   Цитата("AlexandrY")...записываются симво...   Mar 17 2013, 20:30
- - jack_avenger   Цитата(kan35 @ Mar 17 2013, 15:31) Я сдел...   Mar 17 2013, 23:00
- - vassabi   Цитата("vassabi")Очень круто, но я так п...   Mar 18 2013, 00:34
- - GeGeL   И после всего этого еще ругают OCPU, EAT etc. На...   Mar 18 2013, 19:49
|- - Aurochs   Цитата(GeGeL @ Mar 18 2013, 21:49) И посл...   Mar 18 2013, 22:19
|- - stepper88   Недавно соорудил управление Quectel M10 аналогии с...   Mar 22 2013, 09:13
|- - _Артём_   Цитата(stepper88 @ Mar 22 2013, 11:13) Но...   Mar 22 2013, 11:17
- - jack_avenger   Цитата(GeGeL @ Mar 18 2013, 22:49) И посл...   Mar 18 2013, 20:12
- - zebrox   Думаю "отлов" это единственно правильный...   Mar 22 2013, 12:09
|- - megajohn   делаю всё как AlexandrY но с некоторыми отличиями:...   Mar 22 2013, 14:13
|- - _Артём_   Цитата(zebrox @ Mar 22 2013, 14:09) Думаю...   Mar 22 2013, 14:35
- - jack_avenger   Думаю что речь не идет о 100% парсинге, а только о...   Mar 22 2013, 14:44
|- - stepper88   to megajohn А как у вас построенна эта обработка а...   Mar 22 2013, 15:07
|- - vassabi   Цитата(stepper88 @ Mar 22 2013, 17:07) .....   Mar 22 2013, 15:15
|- - stepper88   Цитата(vassabi @ Mar 22 2013, 21:15) А за...   Mar 22 2013, 17:03
- - jack_avenger   Цитата(stepper88 @ Mar 22 2013, 18:07) to...   Mar 22 2013, 15:28
- - zebrox   Ловить надо только то, что нас интересует. В том ...   Mar 22 2013, 16:32
- - jack_avenger   Цитата(zebrox @ Mar 22 2013, 15:09) Думаю...   Mar 22 2013, 17:00
|- - zebrox   Цитата(jack_avenger @ Mar 22 2013, 20:00)...   Mar 22 2013, 17:31
- - jack_avenger   Цитата(zebrox @ Mar 22 2013, 20:31) Оконч...   Mar 22 2013, 17:41
|- - zebrox   Цитата(jack_avenger @ Mar 22 2013, 20:41)...   Mar 22 2013, 18:09
|- - vassabi   Цитата(zebrox)... выставляет сигнал РТЦ. После вых...   Mar 22 2013, 18:13
- - zebrox   да, ртс   Mar 22 2013, 22:23
- - jack_avenger   Цитата(zebrox @ Mar 22 2013, 22:09) Для э...   Mar 23 2013, 13:18
|- - vassabi   Цитата(jack_avenger @ Mar 23 2013, 15:18)...   Mar 23 2013, 17:13
- - zebrox   Честно говоря, не совсем понимаю зачем отличать юр...   Mar 23 2013, 17:52
- - jack_avenger   Цитата(vassabi @ Mar 23 2013, 21:13) По э...   Mar 23 2013, 18:32
|- - vassabi   Цитата(jack_avenger @ Mar 23 2013, 20:32)...   Mar 23 2013, 18:44
- - zebrox   Да нет, обработчик один, на все отведы, эха, юрц. ...   Mar 23 2013, 19:55
- - jack_avenger   Цитата(vassabi @ Mar 23 2013, 22:44) Это ...   Mar 23 2013, 19:55
|- - vassabi   Цитата(jack_avenger @ Mar 23 2013, 21:55)...   Mar 23 2013, 23:44
- - jack_avenger   Цитата(vassabi @ Mar 24 2013, 03:44) GSM ...   Mar 23 2013, 23:51


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 21:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016