STM32 и GPRS модем по USART

Доброго всем времени суток!
Процессор: STM32F100RB
Модем: GL868-DUAL
Задача: отправка раз в 30-60 сек на сервер строки вида $IN,1210280001,00001,120831,112537,113540,0001250,4А&.

Продолжаю разбираться с STM32. Настроил и поднял USART, данные бегают, все хорошо.
Дошло дело до управления модемом. Ручками подключаюсь к GPRS, открываю сокет, передаю данные, закрываю сокет.
Пишу на Си, который параллельно учу.
0. Как лучше реализовать управление модемом?
1. Управление потоком — аппаратно или программно?
2. Как получать и обрабатывать ответы и ошибки от модема? Лупить задержки после каждой команды негоже.

Приветствуются куски кода, примеры.
  • Вопрос задан
  • 16325 просмотров
Решения вопроса 1
@tzirulnicov
Программист
0. куски кода — habrahabr.ru/post/139760/ — раздел «Список литературы». Также стоит скачать библиотеку для Ардуино — там уже есть работа с GPRS, можно посмотреть логику работы.
По части работы с UART рекомендую почитать mycontroller.ru/category/mikrokontrolleryi-stm32/usart/
Еще стоит почитать форум разработчиков устройств сотовой связи: electronix.ru/forum/index.php?s=655eb0cdb872286f07c344e441dfa245&showforum=130

1. Поставьте аппаратное.
2. При работе с модемом использовать таймауты ожидания — ждать ответа на свою команду не более N секунд. Также стоит учитывать, что в готовом изделии возможна ситуация, при котором ваш модем банально зависнет, лечиться передергиванием им питания со стороны микроконтроллера. Т.е. не рассчитывайте на надёжность модема и на то, что в конечном устройстве все будет также хорошо работать, как и у вас на столе. Ну и базовые рекомендации: не забывайте проверять уровень сгигнала (at+csq), состояние gprs-соединения и т.д…
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
svd71
@svd71
У микроконтроллера есть прерывания (или события) на прием данных по UART. Это прерываение срабатывет, когда UART принял какой то байт. Тоесть вы организовываете буффер прием, заполняете его через это прерывание (событие), а в основном цикле (или по таймеру) проверяете, пустой ли буффер или там уже что то похожее на нужные данные. Если да, то данные обрабатываются и буффер очищается.
Точно такая же структура и по отправке. Так же организуете буффер, также делаете прерывание(событие). Только оно срабатывает, когда байт уже передан и нужно продолжать передач следеющего байта.
В основном цикле заполняется только буффер отправки какими то данными и посылается первый байт.

Cам stm32 не знаком, но почитайте тут и тут.
Кроме того найдите даташит своего контроллера — там обычно все расжевано с примерами кода.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы