реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Алгоритм получения строки с СИМХХХ
M_Z
сообщение Nov 22 2010, 18:36
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 483
Регистрация: 1-09-06
Из: Гродно РБ
Пользователь №: 20 011



Цитата(MKdemiurg @ Nov 22 2010, 22:21) *
А не проще без прерывания принимать по флагу приёма? Правда возможны зависания МК, для этого таймер использовать.

такой вариант я бы точно никому не посоветовал. тем более вполне вероятно что проц должен еще нибудь заниматься. прием должен быть в прерывании. вот обработчик может находится в основном цикле. а так буфер фифо, как выше писали, то что надо.
Решил добавить. кроме приема по прерыванию, еще возможен прием по ДМА. тогда просто нужно периодически просматривать приемный буфер. но мне кажется это тоже сложновато будет.

Сообщение отредактировал M_Z - Nov 22 2010, 19:05
Go to the top of the page
 
+Quote Post
MKdemiurg
сообщение Nov 23 2010, 07:13
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939



А если линейная программа , направлена ТОЛЬКО на приём -передачу? Можно уйти от зависания(ожидания приёма) по таймеру. Также набил буфер только в теле программы обработал и погнал дальше.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Nov 23 2010, 08:06
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Я делал так, что по прерыванию заполняется буфер, а второй буфер обрабатывается задачей. Когда прерывание отработало и задача освободилась, то буферы меняются местами и работа продолжается. По сути аналог FIFO, но чуть попроще на мой взгляд и прерывания достаточно запрещать на время смены буферов, а не при каждом обращении к FIFO. Размеры буферов настраиваются исходя из времени переключения задач и скорости UART. Бывает ещё, что FIFO встроенный в процессор, но я даже не знаю как можно хорошо эту фичу применить.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 23 2010, 15:35
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(zebrox @ Nov 22 2010, 17:02) *
А как Вы получаете данные с сима?


При разборе ответом от модема поступаю таким образом:
1. модем отвечает эхом на команду - это можно детектировать как начало ответа
2. ответ на команду содержит специфические сообщения которые можно использовать как признак завершения ответа.
3. любая команда имеет ограниченный таймаут ответа оговоренный в документации

Пример команды AT+CREG?\r\n, таймаут ответа по докам - мгновенно (т.к. не связано с запросами в сеть) - реально даю 1 секунду

AT+CREG?\r\n CMD


AT+CREG\r\n ANS
\r\n
+CREG: 0,1\r\n
\r\n
OK\r\n

Ответ на команду начинается с эха, далее идёт ключевое слово +CREG и завершается команда OK.
В итоге чтобы найти ответ на команду достаточно выловить +CREG и OK в ответе.
Другие команды имеют больше вариантов ответов.


Для приёма ответов от модема у меня есть специальный буффер и задача которая выбирает символы из fifo uarta отвечающего за работу с модемом. Задача не анализирует сам ответ а только следит за тем тем чтобы таймаут с последнего принятого символа превышал определённое время (напр. 50 мС). Как только превысится это время вызывается задача которая послала ат-команду в модем а сам буффер переходит в режим ожидания. Если задача пославшая ат-команду нашла все ответы которые ожидала она переводит буффер в ждущий режим что даёт возможность другим задачам получить доступ к модему. Если ответ не найден то буффер переводится в режим ожидания данных - т.е. пытаемся дополучить ответ от модема на конкретную команду. И так до тех пор пока не получим полный ответ или не выйдет максимальный таймаут ожидания.

Сообщение отредактировал mempfis_ - Nov 23 2010, 15:58
Go to the top of the page
 
+Quote Post
Alechek
сообщение Nov 25 2010, 13:39
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(mempfis_ @ Nov 23 2010, 21:35) *
При разборе ответом от модема поступаю таким образом:
1. модем отвечает эхом на команду - это можно детектировать как начало ответа

Ну зачем же эхо ждать и разбирать. Не проще ли его отключить при иницализации модема. ATE0

Можно и еще интересней поступить... ATV0.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 25 2010, 14:00
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Alechek @ Nov 25 2010, 17:39) *
Ну зачем же эхо ждать и разбирать. Не проще ли его отключить при иницализации модема. ATE0

Можно и еще интересней поступить... ATV0.


Можно и ATE0 подать smile.gif И ответ упростить с помощью ATV0 smile.gif
Я вообще пример расписывал. В своих программах эхо не отключаю (ну не напрягает оно вообще smile.gif ) А ответы обрабатываю по ключевым словам для каждой ат-команды (+CREG: , +CMGL: и т.д.).
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 08:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016