ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
662375
Peter_M (23.03.2016 11:44, просмотров: 3926)
Как оптимально организовать прием сообщений от модуля SIM800С? Извиняюсь, если вопрос простой, велосипед изобрел, но колеса квадратные, хотелось бы узнать о существующих достижениях (вот эту парсер читал). Существующий механизм может потопить небольшой айсберг. Использую модуль SIM800C, который связан по UART с микроконтроллером, в процессе работы создаю GPRS одиночное TCP-соединение для работы со своим сервером, прием данных от модуля в ручном режиме. Насколько я понял, ответы модуля на AT-команды и посылки им URC обрамляются символами 0x0D 0x0A, вот так <CR><LF>ответ<CR><LF>. В прерывании по приему UART у меня используется простой автомат состояний, который принимает начальные <CR><LF>, потом принимает и записывает в приемный буфер сам ответ до появления конечных <CR><LF>, если концевые символы пришли, удаляет их, записывает в конце NULL и выставляет флаг о том, что сообщение принято. Т.е. никакого глубокого анализа принятых данных в целом, или последовательно по каждому символу в прерывании нет. Просто быстрое преобразование их в строки и выставление флага о том, что они есть, а значит можно парсеру выше работать. В основной части программы периодически вызываемый парсер смотрит на флаг о том, что новое сообщение (или сообщения, если их несколько) приняты и анализирует их стандартными функциями для работы со строками (вроде удобно и понятно). Проблема такая: при приеме ответа с данными в ручном режиме на команду AT+CIPRXGET, сами данные не обрамляются с двух сторон, количество их точно на момент приема не известно (только уведомление от модуля, что данные пришли +CIPRXGET: 1, а запрашиваю максимально возможное количество данных). Вот пример ответа на команду приема в ручном режиме : AT+CIPRXGET=2,1460 0x0D 0x0A //начало команды ответа +CIPRXGET +CIPRXGET: 2,<reqlength>,<cnflength> 0x0D 0x0A //конец команды ответа +CIPRXGET данные //данные передаются без всяких префиксов и суффиксов 0x0D 0x0A //начало команды ответа OK OK 0x0D 0x0A //конец команды ответа OK Получается автомат состояний в прерывании по приему UART корректно отработает начало команды ответа: превратит <CR><LF>+CIPRXGET: 2,<reglenght>,<cnflength><CR><LF> в строку +CIPRXGET: 2,<reglenght>,<cnflength>NULL и выставит флаг, что сообщение пришло (хотя оно не полное), а вот потом он начинает принимать следующий ответ, но не знает какой у них размер и когда уже можно прекратить их принимать. Сейчас данные принимаются до тех пор, пока не встретиться последовательность <CR><LF>OK<CR><LF>, конечно, маловероятно, что она может быть среди данных, но может же быть! Или пока не сработает таймаут по приему (примерно рассчитанный на время, которое потребуется заполнить весь приемный буфер со скоростью обмена по UART). Поэтому вопросы такие, зачем эти 0x0D 0x0A, если они не всегда обрамляют(упаковывают) ответы? Чтобы в терминале на экране выглядело все структурировано? Как лучше организовать прием и обработку ответов от модуля?