Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 16.04.2017, 21:18  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Глюк приёма данных по USART

Сообщение от akegor Посмотреть сообщение
Интересно, на какую команду он так отвечает? Или у Вас эхо шалит?
Например AT+CSCA?
Ответ без эха вот такой:
\r\n+CSCA: "+700000000",145\r\n\r\nOK\r\n
Реклама:
supercelt вне форума  
Непрочитано 16.04.2017, 21:21  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Глюк приёма данных по USART

Сообщение от _Артём_ Посмотреть сообщение
Приём в циклический буфер лучше вести всегда (в прерывании USART-а), а не разрешать его после разбора RING и подобных сообщений модема.

Функции типа strstr не очень подходят для обработки сообщений модема, а тем более для работы с циклическим буфером.

P.S. Для работы модемом стоит написать свои функции поиска строк, которые умеют работать с отдельным байтом (то есть сохраняют своё состояние и не ждут символов CRLF и тому подобных). Логично также искаль несколько строк параллельно, так как от модема могут прийти несколько вариантов ответа.
Если возвращаться к циклическому буферу, то приходим в самое начала. Ну вот набили мы этот буфер, точнее набиваем, что-то в него приходит. А как узнать, когда считывать можно? или считывать после каждого принятого байта? Громоздко получится
supercelt вне форума  
Непрочитано 16.04.2017, 21:28  
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Глюк приёма данных по USART

Сообщение от supercelt Посмотреть сообщение
А как узнать, когда считывать можно?
Когда надо, тогда и читаем.
Алгоритм типа такой:
Решили послать какую-то команду
Очистили буфер приёма и передачи.
Послали команду.
Разбираем принятые в буфер данные побайтно (или по несколько за раз).
Как только нашли один из ожидаемых ответов - принимаем решение что делать дальше.

Сообщение от supercelt Посмотреть сообщение
Громоздко получится
Как раз наоборот. Практически не отвлекает и не блокирует ядро для других операций. И не теряет байты.
P.S. Кроме поиска в буфере нужно также завести таймаут на каждую операцию - модем может просто зависнуть и ждать от него ответа станет бессмысленно (например нужно его сбросить).
_Артём_ вне форума  
Непрочитано 16.04.2017, 21:36  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Глюк приёма данных по USART

Сообщение от _Артём_ Посмотреть сообщение
Когда надо, тогда и читаем.
Алгоритм типа такой:
Решили послать какую-то команду
Очистили буфер приёма и передачи.
Послали команду.
Разбираем принятые в буфер данные побайтно (или по несколько за раз).
Как только нашли один из ожидаемых ответов - принимаем решение что делать дальше.


Как раз наоборот. Практически не отвлекает и не блокирует ядро для других операций. И не теряет байты.
P.S. Кроме поиска в буфере нужно также завести таймаут на каждую операцию - модем может просто зависнуть и ждать от него ответа станет бессмысленно (например нужно его сбросить).
То есть в прерывании набили в буфер первый байт и тут же его прочитали и так далее?. Ещё возникает вопрос, как тогда таким методом проверить есть ли в буфере строка RING без функции strstr
supercelt вне форума  
Сказали "Спасибо" supercelt
tolikvoron (18.04.2017)
Непрочитано 16.04.2017, 21:51  
_Артём_
Гражданин KAZUS.RU
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Глюк приёма данных по USART

Сообщение от supercelt Посмотреть сообщение
То есть в прерывании набили в буфер первый байт и тут же его прочитали и так далее?. strstr
Можно тут же, можно (и лучше) читать в основной программе (или задаче, ели еcть RTOS). Модем штука медленная, поэтому можно не на каждый байт дёргаться, а на несколько - типа проверять буфер не чаще нескольких миллисекунд. И обрабатывать несколько байт за раз - это выгоднее чем на каждый байт дёргаться.

Сообщение от supercelt Посмотреть сообщение
Ещё возникает вопрос, как тогда таким методом проверить есть ли в буфере строка RING без функции strstr
Написать свою функцию приёма.
Сам писал похожее - функция искала несколько заданных строк сразу (строки задавались в зависимости от ожидаемых ответов модема). Когда одна из строк совпадала, поиск прекращался и принималось решение что делать дальше (в зависимости от того что нашлось).
Пример - посылаем A+7925xxxxxxxx;
может приёти в ответ CONNECT, BUSY и так далее:
Нажмите, чтобы открыть спойлер

case CONNECT:
ClearUARTBuffer();
// ATD
SendATD();
// number
i=0;
while (i‹ConnectNumberLength) {
WriteByteToUSARTTxBuffer(ConnectNumber[i]);i++;}
// CRLF
SendCRLF();
// загрузка шаблонов
LoadNoCarrier(0);
LoadConnect(1);
LoadOk(2);
LoadError(3);
LoadBusy(4);
LoadNoDialTone(5);
LoadNoAnswer(6);
SetTemplateQty(7);
PollingState++;
break;
case CONNECT+1:
// ожидание 'CONNECT' и 'NO CARRIER' и тп
if (TemplateData.FindFlag) {
// найден шаблон
TemplateData.FindFlag=0;
switch (TemplateData.TemlateNumber) {
case 0:
case 4:
case 5:
case 6:
case 3:
// NO CARRIER, BUSY
PollingState=MODEM_IDLE;
ModemCtrlData.ErrorCode=2;
break;
case 1:
// CONNECT
PollingState=MODEM_IDLE;
ModemCtrlData.ErrorCode=1;
break;
default:
break;
}
}
break;

Последний раз редактировалось _Артём_; 16.04.2017 в 21:56.
_Артём_ вне форума  
Сказали "Спасибо" _Артём_
tolikvoron (18.04.2017)
Непрочитано 18.04.2017, 04:58  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: Глюк приёма данных по USART

Ещё я бы посоветовал не скупиться на кольцевой буфер для приёма, если есть свободная память. И если уж не рекомендуемые 512 байт, то хоть 256 выделить. Ну и можно будет в нём же искать самописной функцией нужные ответы и префиксы.
H4LF вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Ускорить компьютер 7Fantomas7 Ремонт оргтехники 111 08.08.2018 05:27
Получение данных по USART Fangir AVR 32 02.12.2014 15:15
Получение данных по USART в CVAVR himik131 Микроконтроллеры, АЦП, память и т.д 6 12.03.2011 00:12
Вопрос по мультипроцессорному обмену USART MEGA8 vikont-s Микроконтроллеры, АЦП, память и т.д 0 10.08.2006 14:55


Часовой пояс GMT +4, время: 03:38.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot