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

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

21.05.2017, 18:35. Показов 4729. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru