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

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

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

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

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

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


 
Опции темы
Непрочитано 15.07.2017, 17:30  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

AR_Favorit, да, нагляднее, но больше возни с безопасной синхронизацией между обработчиком и программой, а пользы мало. Хотя... может у меня просто паранойя
Реклама:

Последний раз редактировалось H4LF; 15.07.2017 в 17:32.
H4LF вне форума  
Непрочитано 16.07.2017, 16:58  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Глянте плиз у кого есть чуток времени. Вот набросал инит первой команды. Шлет команду, в ответ получает ОК, проверяет и изменяет step_init на соотв номер.

это в основном цикле.
PHP код:
switch(step_init
      {
         case 
0:
            
            break;
         case 
1:
            
send_str("ATE0\r");
            
Delay_ms(10000);
            break;
      }
      
      if (
Receive_C › 0
      {
      
         if (
step_init == 1)
         {
            
            
temp strncmp("\x41\x54\x45\x30\x0D"Receive_buf,5); //ATE0 иногда эта команда возвращается при подаче питания
            
if (temp == 0
            {
               
               
step_init 2;
               
temp strncmp(OKReceive_buf+5,6); // OK
               
if (temp == 0) { Receive_W -= 11Receive_C -= 11step_init 3; };
            } else 
            {
               
temp strncmp(OKReceive_buf,6);
               if (
temp == 0) { Receive_W -= 6Receive_C -= 6step_init 4; }; // OK
            
}
            
         }
         
//         Receive_R++;
//         Receive_C--;
         
      

это прерывание
PHP код:
void USART1_IRQHandler(void)
{
  if((
USART1-›ISR USART_ISR_RXNE)!=0)
  {

        
Receive_buf[Receive_W] = USART1-›RDR;

        
Receive_W++;
        
Receive_C++;

     
USART1-›CR1  |= USART_ISR_RXNE;
  }

Первое что хочу - это распознавание ДТМФ и управление по ним.

Последний раз редактировалось miwutka; 16.07.2017 в 18:18.
miwutka вне форума  
Непрочитано 16.07.2017, 22:09  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

сделал конечный автомат через switch. В нем проверяю и на error и на ok. Пока прописываю инит. Потом буду отлаживать уже на входящие звонки, ДТМФ....
miwutka вне форума  
Непрочитано 17.07.2017, 04:53  
ampy
Гражданин KAZUS.RU
 
Регистрация: 22.07.2007
Адрес: Владивосток
Сообщений: 984
Сказал спасибо: 435
Сказали Спасибо 375 раз(а) в 197 сообщении(ях)
ampy на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Надо перед strncmp делать проверку длины входящей строки.
И проверку на переполнение буфера, раз он не кольцевой.
А раз буфер не кольцевой, то двух переменных не нужно.
Можно легко сделать кольцевой обращаясь к буферу
так Receive_buf[Receive_W & 0xF] (буфер на 16 байт).
Но тогда strncmp не подходит.
И я бы не суетился пока не получен ограничитель строки \n или \r.
А потом бы определил что получено. И записал код полученного
ответа в переменную. Ну типа 'OK' = 1, 'ERROR' = 2.
Ибо как сейчас - лишние сравнения:
buf=='E' -› buf != 'ERROR'
buf=='ER' -› buf != 'ERROR'
buf=='ERR' -› buf != 'ERROR'
итд
А уж если получено что-то неожиданное процесс ожидания знакомой строки
будет длиться до бесконечности.
buf=='васявасяERROR...' никогда не станет равен ничему знакомому.
И коды состояний лучше оформить в виде enum.
А вообще да, как-то так.

Последний раз редактировалось ampy; 17.07.2017 в 05:11.
ampy вне форума  
Сказали "Спасибо" ampy
miwutka (17.07.2017)
Непрочитано 17.07.2017, 10:53  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от ampy Посмотреть сообщение
Надо перед strncmp делать проверку длины входящей строки.
это strlen для этого пойдет?

Сообщение от ampy Посмотреть сообщение
А раз буфер не кольцевой, то двух переменных не нужно.
Можно легко сделать кольцевой обращаясь к буферу
так Receive_buf[Receive_W & 0xF] (буфер на 16 байт).
Но тогда strncmp не подходит.
у меня буфер ограничен переменной char чтобы после 255 обнулялось. Я несообразил как сделать кольцевой буфер пока. Не старался...

Понял что можно поупрощать сравнения. Сделаю упрощения позже. Спасибо.
miwutka вне форума  
Непрочитано 17.07.2017, 12:06  
ampy
Гражданин KAZUS.RU
 
Регистрация: 22.07.2007
Адрес: Владивосток
Сообщений: 984
Сказал спасибо: 435
Сказали Спасибо 375 раз(а) в 197 сообщении(ях)
ampy на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от miwutka Посмотреть сообщение
это strlen для этого пойдет?
Не совсем, т.к. в буфере нет нуля в конце строки.
Длина принятой строки в буфере - Receive_C (или _W, не знаю)
Длина константной строки известна, но можно, наверное и strlen...
Не факт что компилятор ее не будет вычислять каждый раз заново.
Расходы...
Можно такую функцию определить

int strnmiw (const char * str, int n) {
if (Receive_C != n) return -1;
return strncmp(Receive_buf, str, n);
}

и пользоваться ей вместо strncmp.

Сообщение от miwutka Посмотреть сообщение
у меня буфер ограничен переменной char чтобы после 255 обнулялось. Я несообразил как сделать кольцевой буфер пока. Не старался...
Ну это тоже вариант... Но сложный.
ampy вне форума  
Непрочитано 17.07.2017, 13:25  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

miwutka, отмечу только дикую вопиющесть(возможно): Delay_ms(10000), если это блокирующее ожидание, не нужен. Это что, вся программа (кроме прерываний) будет стоять и тупить целых 10 секунд?
Советую освоить программные таймеры, чтобы отмерять время без блокирования, мне лично понравилась такая реализация: http://we.easyelectronics.ru/Soft/sa...yy-taymer.html
В остальном согласен с ampy.

У Вас уже почти кольцевой буфер, если индекс uint8_t (беззнаковый).
http://microsin.net/programming/avr/ring-buffer.html
читать всё, в том числе UPD100920.
Библиотечные нельзя не только потому что там не нультерминированные строки(есть функции которые работают по длине), а потому что они не умеют работать с кольцевым буфером и будут выезжать за его границу (а не ходить по кольцу, как требуется).
H4LF вне форума  
Сказали "Спасибо" H4LF
miwutka (17.07.2017)
Непрочитано 17.07.2017, 15:07  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

H4LF, задержка там от фонаря примерно 1 сек чисто для отладки. Чтоб не пролетало в компорту данные все быстро. Задержки будут на Systick.

Посмотрел видео
Видео:
- про строки. Теперь чуток понял что к чему... Как мне говорили выше, что удобно отслеживать начало и конец строки по символам 0x0D и 0x0A.
0x0D это \r ??
0x0A это \n ??
если это так то логичнее отслеживать строки. Так как модуль отправляет строками то как раз будет удобно отследить прием строки и потом уже сравнивать ее разными вариантами. Я со строками никогда не работал поэтому туго понимаю еще. Ютуб помог, теперь стало всё яснее.
miwutka вне форума  
Непрочитано 17.07.2017, 16:09  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

miwutka, ну если просто для отладки(не окончательной, а для тестирования идей) и блокировка на это время не мешает(понимаете что делаете) то ничего страшного. А заблокировать выполнение программы можно и на Systick и на других аппаратных таймерах - доказано.
H4LF вне форума  
Непрочитано 17.07.2017, 16:59  
Bill
Гражданин KAZUS.RU
 
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
Bill на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от Someone Посмотреть сообщение
Конечно. Но это сугубо "внутри" ядра процессора, на уровне ассемблера. Архитектуры-то разные, не во всех есть команды блочного копирования, не у всех есть дма, есть куча различных тонкостей. А вот на уровне С всё таки сводится к побайтному копированию. И когда тот же ГЦЦ портируют под новую архитектуру, никто не переписывает библиотеки под новое ядро ручками на асме.
Не о том речь. 16-разрядный процессор может копировать не побайтно, а пословно, т.е. по 2 байта зараз. Но при этом нужно учитывать четность количества копируемых байт. Если число байт нечетно, то сначала копируется 1 байт, а все остальные копируются словами.
Bill вне форума  
 

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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32f415 и usart b USB bass1981 ARM 0 07.07.2017 14:47
Глюк приёма данных по USART supercelt ARM 85 18.04.2017 04:58
Почему USART работает правильно? zhan99999 Микроконтроллеры, АЦП, память и т.д 10 24.01.2010 15:39
Помогите разобраться с USART в CodeVisionAVR vendim Микроконтроллеры, АЦП, память и т.д 20 26.07.2007 16:42


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


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