Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
RottirBob

Определение конца передачи через UART

21.05.2017, 18:35. Показов 4735. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Докатился я до работы с GSM модулем. И возникла у меня проблема. Как определить, что GSM модуль передал всё что он хотел сказать и начать обрабатывать входной буфер?
Все сообщения начинаются и оканчиваются <CR><LF>, можно было бы по ним, но есть некоторые сообщения где передаётся не одна строка, а несколько. Соответственно последовательностей <CR><LF> может быть больше чем две. Некоторые сообщения заканчиваются "OK<CR><LF>", некоторые "ERROR<CR><LF>", некоторые "CMS ERROR:<error><CR><LF>". Обрабатывать все возможные варианты устанешь.
Существует ли какой-нибудь универсальный способ чтобы понять, что передача окончена, можно разбирать уже посылку?
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.05.2017, 18:35
Ответы с готовыми решениями:

UART настройка скорости передачи.
Здравствуйте форумчане, снова нужна ваша помощь, суть проблемы такая: имеется msp430 и LCD дисплей iokit320f-8e, необходимо по uartу...

Сжатие данных для передачи по UART
Добрый день! Контроллер передаёт по UARTу данные (числа разделённые знаком табуляции в формате ASCII) размером от 256 байт до 2 кБ. Я думаю...

STM32F4xx SPI (Master only) + DMA определение конца передачи
Вопрос собственно в следующем: как отслеживать, что SPI физически закончил передавать данные? DMA рапортует об окончании передачи тогда,...

11
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
21.05.2017, 19:07
Знать бы камень - подсказали бы.
А так бит idle и соответствующее прерывание. Но это пальцем в небо.
Смотреть документацию на МК, что там есть.
0
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 65
21.05.2017, 19:11
Если строк несколько и они "локализованы" в одном интервале с последующим "значительным" молчанием - то можно во время прихода начала пакета (каждой строки) запускать таймер на интервал приема строки/строк. По окончанию приема, сработавший таймер даст знать о том, что надо обрабатывать данные.
0
RottirBob
21.05.2017, 19:26
otixsom, камень Atmega8. Ничего похожего на idle там нет (или я не вижу).
Mitior, спасибо за идею. Сам думал про таймауты. Но не знал к чему привязаться. Твоя идея стоящая, попробую реализовать.
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
21.05.2017, 22:29
Обычно у модулей есть вывод RING или сообщение по USORT , сообщающий пришло что-то не виданное. Нормально принятое сообщение заканчивается ОК , вот если в конце буфера сие есть, имеет смысл узнать , что прислали . Остальное в игнор.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
22.05.2017, 04:28
Можно конечно, но тогда потеряются UNC
0
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 752
22.05.2017, 07:29
...модем сферический? Если производитель следовал стандарту, то поможет активация режима URCS (отключенный по-умолчанию режим модема, выдающий системные логи-отчеты о выполнении тех или иных операций).

...
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
22.05.2017, 09:33
При работе с SIM900 делали по таймауту. По концу строки бесполезно, может быть несколько cr lf в одной посылке.
0
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
22.05.2017, 09:59
А это действительно надо - ждать конца передачи? Можно настроить прерывание на каждый символ, а по приходу конца строки идти обрабатывать строку и принимать решения. В это время модем может присылать что-то еще. Сообщения обычно несут примитивный смысл, и я не вижу необходимости их комбинировать в один пакет. Если очередное сообщение перебивает предыдущее по смыслу, то актуализировать состояние по последнему сообщению. Единицей для нарезки естественным образом является строка.

Если же это данные пользователя, то этот поток форматируется как нам удобно.
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
22.05.2017, 10:37
Удобнее оперировать с готовым пакетом. Например, при приеме данных по gprs там этих cr lf может быть несколько десятков, при приеме смс на каждую строчку в смс тоже будет свой cr lf. Сейчас открыл исходники - работает по таймауту, но для ускорения отлавливаем еще cr lf OK cr lf в конце буфера, и тогда не ждем таймаут. Хотя как показала практика, следующую команду все равно лучше отправить через 50-100 мс. Пытались без паузы - то ли у модема входной буфер забивается, то ли еще что - просто зависал. Косяков с SIM900 хватало. И да, atmega8 врядли хватит для полноценной работы с модемом, слишком мало оперативки.
0
RottirBob
22.05.2017, 13:23
Atmega8 для моих задач вполне достаточно. Через GSM модуль работа идёт только посредством СМС, коих всего-то четыре штуки. Ну и ответ отправить. Вчера накидал работу с буфером по таймауту. Вполне рабочий вариант. Учитывая что сам GSM модуль тот еще молчун. Сам ничего не говорит, только в ответ на АТ-запросы.

Суть такова.
Посылаю АТ-команду. Обработчик прерываний по приёму байта с UART выставляет програмный флаг RCVB и сбрасывает таймер uartTimer.
Я всегда завожу внутренний таймер на 50 прерываний в секунду. Какие-нибудь секундные таймеры посчитать, опрос кнопок сделать, дисплей обновить. Удобная вещь в хозяйстве одним словом. Во время такого прерывания проверяется флаг RCVB и, если он установлен, то увеличивается uartTimer раз в секунду. Если он дотикал до какой-нибудь константы заданной в дефайнах значит приёма байт не было уже количество секунд заданной в константе. Снимаю флаг RCVB, выставляю флаг RCVD - прём пакета окончен.
В основном цикле по выставлению этого флага можно начинать обрабатывать входной буфер.
Tordirom
03.10.2017, 21:19
Привет всем!
Попался и мне GSM A6. Дня три я с ним воевал, пока не нашёл код устанавливающий скорость обмена.
Теперь то же встал вопрос определять есть ли СМС, и принимать его в переменную val.
Никаких таймеров не нужно. Всё предельно просто. Есть вот такая функция Serial.available() . Которая выдаёт количество байт доступных для считывания через последовательный порт. Читаем СМС пока не станет равно нулю. И наоборот начинаем читать как только стало больше нуля.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2017, 21:19
Помогаю со студенческими работами здесь

STM32F103XXXX UART с контролем передачи через RTS и CTS
Добрый день! У меня никак не получается задействовать UART с контролем передачи c помощью ножек RTS и CTS. Моя настройка UART выглядит...

st8s105 задержка вывода через uart после передачи
Здравствуйте, друзья. В общем решил поднять один старый проект, который вполне работал, оставалось только причесать алгоритмы программы. На...

UART Tx complete interrupt происходит без передачи
Пытаюсь написать код как посылать символ через UART без поллинга USORT1_SR_bit.TXE но почему то прерывание UART UART2 Tx somplete после...

Софтварный uart на tiny 26. Частота передачи данных.
И снова здравствуйте! Появилась у меня тут необходимость передавать данные с устройства на компьютер. Устройство на тиньке. К моему...

Формирование пакета данных для передачи по UART
...доброго времени суток, уважаемые форумчане! Возник вопрос: имеется ли в CodeVisionAVR 1.25 для ATmega8 тип данных эквмвалентный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru