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

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

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

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

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

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


 
Опции темы
Непрочитано 13.07.2017, 13:03  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Разумеется есть. Я просто объясняю, как это работает

Конкретно, с использованием стандартной библиотеки, поиск некоторой строки, находящейся в буфере в произвольном месте - это функция strstr.
Но есть проблема - такой поиск находит в буфере не точное соответствие строки, а любое полное совпадение искомых символов в заданном порядке. В принципе, ничего страшного конкретно в данном случае.

Сообщение от miwutka Посмотреть сообщение
ответ должно прийти OK[]= "\x0D\x0A\x4F\x4B\x0D\x0A";//
А теперь если перевести эту строку в понятное ANSI-представление, то получится
\r\nOK\r\n

то есть, отдельная терминальная строка, с переносом

OK

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

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

да уж... прием данных и их расшифровка намного сложнее чем отправка ))
на команду ATE0 приходит то ОК то Call Ready SMS Ready..... Надо очень глубоко продумывать алгоритм.....
Думал может нужно после каждой команды делать задержку в 1 секунду например, потом функцией strlen смотреть сколько данных пришло. И потом уже их разбирать в зависимости от количества полученных данных в посылке...? Как думаете как это правильнее сделать? Или просто использовать счетчик необработанных данных 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;
  }
}

int main(void)
{
   
send_str("ATE0\r");
   
Delay_ms(20000); 

   
temp strncmp(OKReceive_buf+5,6); //на этом этапе в буффере то 13 то 26 значений то 28.
   
while (temp != 0)
   {}

  
send_str("AT+DDET=1\r");
  
Delay_ms(20000);

 while(
1){}

miwutka вне форума  
Непрочитано 13.07.2017, 15:51  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,653
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от miwutka Посмотреть сообщение
eddy, я так понял что вот это мне надо?
Зависит от того, какая поставлена задача. Но явно понадобится модифицированная функция strchr для перехода к следующему полю. Чтобы лишних данных не вылезало, сразу же все ненужное надо прикрыть — у меня в коде это было.
[P.S. что-то я решил, что GPS нужен, с GSM работа несколько отличается]
Сообщение от индюк Посмотреть сообщение
это все в string.h есть
Прежде всего, нужно проверить, во что все это выльется. Возможно, компилятор ничего лишнего не запихнет — тогда можно радоваться, а возможно, добавит еще лишний килобайт к размеру кода — тогда нужно свою реализацию писать.
Ну, про printf и жирафу понятно, что библиотечный ни в коем случае нельзя использовать. А вот memcpy — вполне даже, т.к. он должен быть более оптимизирован чем тупое побайтное копирование.
Сообщение от NewWriter Посмотреть сообщение
поиск некоторой строки, находящейся в буфере в произвольном месте - это функция strstr.
Не представляю, чем strstr может помочь при работе с GSM. А вот strcmp там наверняка пригодится.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 13.07.2017, 15:53  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,653
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Да, забыл сказать: прежде, чем научиться работать с GPS/GSM на МК, я набросал нужный код на компе — все равно ведь "подноготная" будет одной и той же. Как отладил, так и стал переделывать под МК, выбрасывая все жирное.
А можно и на компе сразу все жирное повыбрасывать, и готовый код сразу на МК гонять.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 13.07.2017, 17:16  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от miwutka Посмотреть сообщение
Я думаю так:
Миш, так думают и пишут код правоверные индусы . Нормальные люди принимают всю строку в буфер, а потом используют стандартные функции из библиотеки "string.h", которая есть в любом компиляторе С/С++, так что Кэрригана с Ричи (не смотря на их древность, по прежнему актуальная книжка) в помощь - там ты можешь прочитать все подробности. Страшное слово "парсинг" можно заменить словами "разбор", "анализ" и прочие менее страшными.
Someone вне форума  
Сказали "Спасибо" Someone
miwutka (13.07.2017)
Непрочитано 13.07.2017, 17:20  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от eddy Посмотреть сообщение
Ну, про printf и жирафу понятно, что библиотечный ни в коем случае нельзя использовать. А вот memcpy — вполне даже, т.к. он должен быть более оптимизирован чем тупое побайтное копирование.
Пытался понять как работает memcpy но чет так и не могу понять. Поэтому незнаю как его применить в моем случае.....

У меня буффер на 255 элементов. Все данные пишутся в него и это всё надо разбирать. Я вот думаю, когда приходят ответы писать их в разные буферы. Так наверно будет легче находить нужный текст... Или всё же както проще из одного буффера всё извлекать?

Я не доконца понимаю как происходит прием данных по USART. флаг RXNE устанавливается после приема каждого символа?

ну да после каждого... у меня ж счетчик ))

Последний раз редактировалось miwutka; 13.07.2017 в 17:24.
miwutka вне форума  
Непрочитано 13.07.2017, 17:24  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от miwutka Посмотреть сообщение
смотреть сколько данных пришло. И потом уже их разбирать в зависимости от количества полученных данных в посылке...?
Зачем? Когда ты ищешь подстроку в строке - библиотечная функция делает всё сама. Длина строки тебе совершенно не нужна.
Someone вне форума  
Непрочитано 13.07.2017, 17:33  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Сообщение от eddy Посмотреть сообщение
Возможно, компилятор ничего лишнего не запихнет — тогда можно радоваться, а возможно, добавит еще лишний килобайт к размеру кода


Сообщение от eddy Посмотреть сообщение
тогда нужно свою реализацию писать.
Которая добавит к коду пару килобайт.

Сообщение от eddy Посмотреть сообщение
А вот memcpy — вполне даже, т.к. он должен быть более оптимизирован чем тупое побайтное копирование.
Шедевр. 5 Баллов.

Сообщение от miwutka Посмотреть сообщение
Пытался понять как работает memcpy но чет так и не могу понять.
Работает просто - ведь это "тупое побайтовое копирование". Указывается в параметрах процедуры два адреса и число байт. Из одного данные копируются, в другой пишутся. Естественно, адреса указываются стандартным для С способом - операцией "взять адрес" после которого идёт имя переменной, в которой расположены данные. Смотри раздел "работа с указателями" в тех же Керригане с Ричи.
Someone вне форума  
Непрочитано 13.07.2017, 17:34  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: SIM800 + stm030 как правильно принимать по USART?

Кстати при приёме в буфер для обработки стоит отбрасывать CR и LF, считая их признаком конца строки. Дополнительно выкидывать пустые строки.
Тогда будет идти обработка только значащих данных в строке.
Для приёма таки удобнее использовать два буфера для строк, тогда дольше не будет проблем с обработкой и логика прозрачнее.

Someone, Копирование может быть и не побайтным с анализом длины на четность. Работать будет несколько быстрее. Такие фокусы знакомы ещё с времён зари x86 - приходилось оптимизировать функции для обработки больших массивов, и каждый лишний такт там был целью.

А как реализованы функции в библиотеке - можно будет посмотреть или в отладчике или по дампу.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 13.07.2017 в 17:40.
mike-y-k вне форума  
 

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

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

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, время: 23:00.


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