Easyelectronics.ru

Электроника для всех
Текущее время: 19 июл 2018, 22:36

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Определение конца передачи через UART
СообщениеДобавлено: 22 май 2017, 19:22 
Только пришел

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 26
Добрый день.
Докатился я до работы с GSM модулем. И возникла у меня проблема. Как определить, что GSM модуль передал всё что он хотел сказать и начать обрабатывать входной буфер?
Все сообщения начинаются и оканчиваются <CR><LF>, можно было бы по ним, но есть некоторые сообщения где передаётся не одна строка, а несколько. Соответственно последовательностей <CR><LF> может быть больше чем две. Некоторые сообщения заканчиваются "OK<CR><LF>", некоторые "ERROR<CR><LF>", некоторые "CMS ERROR:<error><CR><LF>". Обрабатывать все возможные варианты устанешь.
Существует ли какой-нибудь универсальный способ чтобы понять, что передача окончена, можно разбирать уже посылку?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 22 май 2017, 19:54 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1605
Откуда: Харьков
Знать бы камень - подсказали бы.
А так бит idle и соответствующее прерывание. Но это пальцем в небо.
Смотреть документацию на МК, что там есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 22 май 2017, 19:58 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 02 дек 2010, 19:20
Сообщения: 71
Если строк несколько и они "локализованы" в одном интервале с последующим "значительным" молчанием - то можно во время прихода начала пакета (каждой строки) запускать таймер на интервал приема строки/строк. По окончанию приема, сработавший таймер даст знать о том, что надо обрабатывать данные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 22 май 2017, 20:13 
Только пришел

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 26
alexsam, камень Atmega8. Ничего похожего на idle там нет (или я не вижу).
Meteor, спасибо за идею. Сам думал про таймауты. Но не знал к чему привязаться. Твоя идея стоящая, попробую реализовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 22 май 2017, 23:16 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2489
Откуда: Москва
Обычно у модулей есть вывод RING или сообщение по USART , сообщающий пришло что-то не виданное. Нормально принятое сообщение заканчивается ОК , вот если в конце буфера сие есть, имеет смысл узнать , что прислали . Остальное в игнор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 23 май 2017, 05:15 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1333
Можно конечно, но тогда потеряются UNC


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 23 май 2017, 08:16 
Старожил

Зарегистрирован: 26 апр 2013, 23:55
Сообщения: 971
...модем сферический? Если производитель следовал стандарту, то поможет активация режима URCS (отключенный по-умолчанию режим модема, выдающий системные логи-отчеты о выполнении тех или иных операций).

...

_________________
Белорусский журнал «Радиолюбитель»
Мои разработки http://raxp.radioliga.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 23 май 2017, 10:20 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2652
При работе с SIM900 делали по таймауту. По концу строки бесполезно, может быть несколько cr lf в одной посылке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 23 май 2017, 10:46 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2921
Откуда: Тольятти
А это действительно надо - ждать конца передачи? Можно настроить прерывание на каждый символ, а по приходу конца строки идти обрабатывать строку и принимать решения. В это время модем может присылать что-то еще. Сообщения обычно несут примитивный смысл, и я не вижу необходимости их комбинировать в один пакет. Если очередное сообщение перебивает предыдущее по смыслу, то актуализировать состояние по последнему сообщению. Единицей для нарезки естественным образом является строка.

Если же это данные пользователя, то этот поток форматируется как нам удобно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 23 май 2017, 11:24 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2652
Удобнее оперировать с готовым пакетом. Например, при приеме данных по gprs там этих cr lf может быть несколько десятков, при приеме смс на каждую строчку в смс тоже будет свой cr lf. Сейчас открыл исходники - работает по таймауту, но для ускорения отлавливаем еще cr lf OK cr lf в конце буфера, и тогда не ждем таймаут. Хотя как показала практика, следующую команду все равно лучше отправить через 50-100 мс. Пытались без паузы - то ли у модема входной буфер забивается, то ли еще что - просто зависал. Косяков с SIM900 хватало. И да, atmega8 врядли хватит для полноценной работы с модемом, слишком мало оперативки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 23 май 2017, 14:10 
Только пришел

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 26
Atmega8 для моих задач вполне достаточно. Через GSM модуль работа идёт только посредством СМС, коих всего-то четыре штуки. Ну и ответ отправить. Вчера накидал работу с буфером по таймауту. Вполне рабочий вариант. Учитывая что сам GSM модуль тот еще молчун. Сам ничего не говорит, только в ответ на АТ-запросы.

Суть такова.
Посылаю АТ-команду. Обработчик прерываний по приёму байта с UART выставляет програмный флаг RCVB и сбрасывает таймер uartTimer.
Я всегда завожу внутренний таймер на 50 прерываний в секунду. Какие-нибудь секундные таймеры посчитать, опрос кнопок сделать, дисплей обновить. Удобная вещь в хозяйстве одним словом. Во время такого прерывания проверяется флаг RCVB и, если он установлен, то увеличивается uartTimer раз в секунду. Если он дотикал до какой-нибудь константы заданной в дефайнах значит приёма байт не было уже количество секунд заданной в константе. Снимаю флаг RCVB, выставляю флаг RCVD - прём пакета окончен.
В основном цикле по выставлению этого флага можно начинать обрабатывать входной буфер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Определение конца передачи через UART
СообщениеДобавлено: 04 окт 2017, 22:06 
Здравствуйте!

Зарегистрирован: 04 окт 2017, 21:53
Сообщения: 1
Привет всем!
Попался и мне GSM A6. Дня три я с ним воевал, пока не нашёл код устанавливающий скорость обмена.
Теперь то же встал вопрос определять есть ли СМС, и принимать его в переменную val.
Никаких таймеров не нужно. Всё предельно просто. Есть вот такая функция Serial.available() . Которая выдаёт количество байт доступных для считывания через последовательный порт. Читаем СМС пока не станет равно нулю. И наоборот начинаем читать как только стало больше нуля.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB