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

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

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

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

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

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


 
Опции темы
Непрочитано 05.01.2017, 17:15  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Приём строки по USART [STM32] Keil5

Привет!. Помогите пожалуйста. Для вас это наверное расплюнуть, а у меня непонятки. Пишу код в Keil под stm32. Есть модуль, от которого по usart приходит строка вот такого вида:

Код:
r\n\
+CMGR: "993848",145
r\n\
r\n\
OK
Цель: выделить всё что между кавычек. Я так поразмыслил это можно делать 2 способами.

Первый:
Это кусок кода в файле mod.c где и крутится всё что касается модуля.
Код:
char buffer[];
uint8_t i;
void USART1_IRQHandler(void){ //Прерывание USART1
        if(USART1-›SR & USART_SR_RXNE){ //Если прерывание вызвано по приёму USART1
                USART1-›SR &= ~USART_SR_RXNE; //Сбрасываем флаг приёма USART1
                flag_receive = 1;
        }
}
void Get(){
buffer[i++] = USART1-›DR;
}
Здесь стандартно по прерыванию приёма я сбрасываю флаг, устанавливаю флаг, что я готов записать принятый байт и быстро ухожу. В самом прерывании я не стал записывать в переменную содержание регистра DR ибо сами знаете делать что-то в прерывании не комильфо.
значит флаг flag_receive установился и далее в цикле while файла main.c:
if(flag_receive){
Get();
flag_receive = 0;
}
Далее вызываем Get и всё складируется в buffer. Далее с помощью регулярки выдернуть всё что между кавычек.

Вариант 2
Код:
char buffer;
char str[];
void Get(){
    uint8_t f;
    buffer = USART1-›DR;
    if(f){
        str[i++] = buffer;
    }
    if(buffer == """){
        if(f){
            f = 0;
        } else {
            f = 1;
        }
    }
}
То есть вытягиваем нужную строку непосредственно в процессе приёма байтов посимвольно.
В коде могут быть ошибки, так как хотел показать идею.
А теперь главные вопросы
Если сначала набивать массив строкой, а потом разбирать регуляркой, как написать эту самую регулярку, что бы между кавычек вытащить?
И второй вопрос, что будет работать быстрее и эффективнее 1 или 2 вариант?
Реклама:
supercelt вне форума  
Непрочитано 05.01.2017, 17:27  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

Лучше все-таки буфер в прерывании набивать, выставляя флаг готовности строки по получению "\n".
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Сказали "Спасибо" eddy
supercelt (05.01.2017)
Непрочитано 05.01.2017, 17:38  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

Сообщение от eddy Посмотреть сообщение
Лучше все-таки буфер в прерывании набивать, выставляя флаг готовности строки по получению "\n".
А потом регуляркой тащить?
supercelt вне форума  
Непрочитано 05.01.2017, 18:07  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

char buffer[]; - это что еще такое????
Easyrider83 вне форума  
Непрочитано 05.01.2017, 18:16  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

Прием в прерывании идет? Ну так проверяйте там же каждый принятый байт на равенство символу ". Получили первый символ ", дальнейшие принятые байты складируйте (или копируйте) в отдельный буфер, так же проверяя каждый принятый байт на равенство символу ". Приняли второй ", прекращаете заполнение отдельного буфера и ставите флаг выполнения.

Всё с GPS пытаетесь работать?

Последний раз редактировалось NewWriter; 05.01.2017 в 18:22.
NewWriter вне форума  
Непрочитано 05.01.2017, 20:10  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

Это не GPS, а GSM)

И не надо в прерывании кавычки искать, надо как Эдди написал делать.
А потом уже парсить строку, и сначала определять, что там от мамеда вообще пришло, а уж потом в зависимости от того, что именно пришло, продолжать разбор (или выставлять флаги, или...).

Тем более что фиг там будет именно такого вида строка))) Там после +CMGR: сначала в кавычках статус сообщения должен быть (для входящих - "REC READ" или "REC UNREAD"), а уж потом после запятой еще кавычки - уже с номером...

Последний раз редактировалось AR_Favorit; 05.01.2017 в 20:12.
AR_Favorit вне форума  
Непрочитано 05.01.2017, 21:59  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

Сообщение от AR_Favorit Посмотреть сообщение
Это не GPS, а GSM)

И не надо в прерывании кавычки искать, надо как Эдди написал делать.
А потом уже парсить строку, и сначала определять, что там от мамеда вообще пришло, а уж потом в зависимости от того, что именно пришло, продолжать разбор (или выставлять флаги, или...).

Тем более что фиг там будет именно такого вида строка))) Там после +CMGR: сначала в кавычках статус сообщения должен быть (для входящих - "REC READ" или "REC UNREAD"), а уж потом после запятой еще кавычки - уже с номером...
Кстати если набивать, то парсить надо уже не строку. Это будет массив из N символов. Циклом что ли его потом перебрать?
supercelt вне форума  
Непрочитано 05.01.2017, 22:30  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

Сообщение от supercelt Посмотреть сообщение
А потом регуляркой тащить?
Ни в коем разе: регулярка - слишком дорогое удовольствие. Тупо своим аналогом strchr.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 05.01.2017, 22:32  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

Сообщение от AR_Favorit Посмотреть сообщение
Это не GPS, а GSM)
Вот, кстати, я себе с GPS уже обработчик делал (в хронометре для даунхилла - код у меня на гитхабе можно найти), а вот с GPS еще не работал (только на "малинке"). Надо бы под STM32 и для работы с GPS написать сниппеты - если будем развивать хронометр, понадобится передавать информацию смсками (а то и вообще по жопорезу).
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 06.01.2017, 06:28  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Приём строки по USART [STM32] Keil5

Сообщение от supercelt Посмотреть сообщение
Кстати если набивать, то парсить надо уже не строку. Это будет массив из N символов. Циклом что ли его потом перебрать?
Строка в Си - это и есть массив из символов, последним из которых является ноль, то бишь '/0' (и обратите внимание на пост Easyrider83).

Если во время "набивки" в прерывании этого самого массива обнаруживаем '/n' - в очередную позицию массива добавляем не '/n', а '/0', и больше ничего не добавляем, выставив флаг готовности строки - и у нас имя массива (без кавычек) - это и есть имя null-terminated строки, с которой можно работать посредством функций, объявленных в strings.h.

Но с точки зрения быстродействия выгоднее действительно перебирать этот массив-строку посимвольно.

Последний раз редактировалось AR_Favorit; 06.01.2017 в 06:39.
AR_Favorit вне форума  
 

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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строки по USART yellow87 Микроконтроллеры, АЦП, память и т.д 2 08.10.2010 15:23
Вывод строки в USART rocky7 Микроконтроллеры, АЦП, память и т.д 4 02.10.2010 22:51
Помогите разобраться с USART в CodeVisionAVR vendim Микроконтроллеры, АЦП, память и т.д 20 26.07.2007 16:42


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


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