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

 
 
> Алгоритм получения строки с СИМХХХ
zebrox
сообщение Nov 22 2010, 13:02
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 17-04-09
Пользователь №: 47 838



Всем привет.
Может вопрос глупый конечено, и никакой проблемы нет.

Есть вопрос такого плана.
Как правильно получать строку (ответа) от сима.
\r\nMessage\r\n

Я вижу два возможных варианта.

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

Вариан 2, извращенный smile.gif
1.При первом прерывании от юарта, получаем символ, записываем в буффер, запускаем таймер на 0.4сек скажем.
2.при следующем прерывании от юарта (до истечения таймера), записываем следующий символ в буффер, перезапускаем таймер.
3.так делаем до тех пор, пока таймер 0,4 сек не истечет или буфер не заполнится.
4.Когда таймер истек, имеем в буффере все сообщение от сима, обрабатываем его.

А как Вы получаете данные с сима?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mempfis_
сообщение Nov 23 2010, 15:35
Сообщение #2


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

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- zebrox   Алгоритм получения строки с СИМХХХ   Nov 22 2010, 13:02
- - Палыч   Что-то не пойму: в чём проблема? Принимайте символ...   Nov 22 2010, 13:15
- - zebrox   если ли по \r\n обрабатывать, то можно н...   Nov 22 2010, 14:51
|- - rx3apf   Цитата(zebrox @ Nov 22 2010, 17:51) если ...   Nov 22 2010, 14:57
|- - Палыч   Цитата(zebrox @ Nov 22 2010, 17:51) если ...   Nov 22 2010, 15:40
- - zebrox   А какие правильные установки порогов управления по...   Nov 22 2010, 15:11
- - skripach   Цитатаесли ли по \r\n обрабатывать, то м...   Nov 22 2010, 15:16
- - zebrox   пока я это смутно представляю. правилен ли следую...   Nov 22 2010, 15:44
|- - rx3apf   Цитата(zebrox @ Nov 22 2010, 18:44) пока ...   Nov 22 2010, 16:00
- - zebrox   ок, если паузу установить нельзя, тогда вопрос по ...   Nov 22 2010, 16:00
|- - rx3apf   Цитата(zebrox @ Nov 22 2010, 19:00) Прави...   Nov 22 2010, 16:03
- - zebrox   Ок, товарищ из третьего района, спасибо большое т...   Nov 22 2010, 16:09
|- - rx3apf   Цитата(zebrox @ Nov 22 2010, 19:09) тольк...   Nov 22 2010, 16:27
- - ArtemKAD   ЦитатаRTS-выставляем когда проц готов получать дан...   Nov 22 2010, 17:46
- - MKdemiurg   А не проще без прерывания принимать по флагу приём...   Nov 22 2010, 18:21
|- - M_Z   Цитата(MKdemiurg @ Nov 22 2010, 22:21) А ...   Nov 22 2010, 18:36
- - MKdemiurg   А если линейная программа , направлена ТОЛЬКО на п...   Nov 23 2010, 07:13
- - andrewlekar   Я делал так, что по прерыванию заполняется буфер, ...   Nov 23 2010, 08:06
- - Alechek   Цитата(mempfis_ @ Nov 23 2010, 21:35) При...   Nov 25 2010, 13:39
- - mempfis_   Цитата(Alechek @ Nov 25 2010, 17:39) Ну з...   Nov 25 2010, 14:00


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

 


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


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