05.01.2017, 17:15
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Приём строки по 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 вариант?
|
|
|
|
05.01.2017, 17:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Приём строки по USART [STM32] Keil5
Лучше все-таки буфер в прерывании набивать, выставляя флаг готовности строки по получению "\n".
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
05.01.2017, 17:38
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Приём строки по USART [STM32] Keil5
Сообщение от eddy
|
Лучше все-таки буфер в прерывании набивать, выставляя флаг готовности строки по получению "\n".
|
А потом регуляркой тащить?
|
|
|
|
05.01.2017, 18:07
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Приём строки по USART [STM32] Keil5
char buffer[]; - это что еще такое????
|
|
|
|
05.01.2017, 18:16
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Приём строки по USART [STM32] Keil5
Прием в прерывании идет? Ну так проверяйте там же каждый принятый байт на равенство символу ". Получили первый символ ", дальнейшие принятые байты складируйте (или копируйте) в отдельный буфер, так же проверяя каждый принятый байт на равенство символу ". Приняли второй ", прекращаете заполнение отдельного буфера и ставите флаг выполнения.
Всё с GPS пытаетесь работать?
Последний раз редактировалось NewWriter; 05.01.2017 в 18:22.
|
|
|
|
05.01.2017, 20:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Приём строки по USART [STM32] Keil5
Это не GPS, а GSM)
И не надо в прерывании кавычки искать, надо как Эдди написал делать.
А потом уже парсить строку, и сначала определять, что там от мамеда вообще пришло, а уж потом в зависимости от того, что именно пришло, продолжать разбор (или выставлять флаги, или...).
Тем более что фиг там будет именно такого вида строка))) Там после +CMGR: сначала в кавычках статус сообщения должен быть (для входящих - "REC READ" или "REC UNREAD"), а уж потом после запятой еще кавычки - уже с номером...
Последний раз редактировалось AR_Favorit; 05.01.2017 в 20:12.
|
|
|
|
05.01.2017, 21:59
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Приём строки по USART [STM32] Keil5
Сообщение от AR_Favorit
|
Это не GPS, а GSM)
И не надо в прерывании кавычки искать, надо как Эдди написал делать.
А потом уже парсить строку, и сначала определять, что там от мамеда вообще пришло, а уж потом в зависимости от того, что именно пришло, продолжать разбор (или выставлять флаги, или...).
Тем более что фиг там будет именно такого вида строка))) Там после +CMGR: сначала в кавычках статус сообщения должен быть (для входящих - "REC READ" или "REC UNREAD"), а уж потом после запятой еще кавычки - уже с номером...
|
Кстати если набивать, то парсить надо уже не строку. Это будет массив из N символов. Циклом что ли его потом перебрать?
|
|
|
|
05.01.2017, 22:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Приём строки по USART [STM32] Keil5
Сообщение от supercelt
|
А потом регуляркой тащить?
|
Ни в коем разе: регулярка - слишком дорогое удовольствие. Тупо своим аналогом strchr.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
05.01.2017, 22:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Приём строки по USART [STM32] Keil5
Сообщение от AR_Favorit
|
Это не GPS, а GSM)
|
Вот, кстати, я себе с GPS уже обработчик делал (в хронометре для даунхилла - код у меня на гитхабе можно найти), а вот с GPS еще не работал (только на "малинке"). Надо бы под STM32 и для работы с GPS написать сниппеты - если будем развивать хронометр, понадобится передавать информацию смсками (а то и вообще по жопорезу).
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
06.01.2017, 06:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Приём строки по USART [STM32] Keil5
Сообщение от supercelt
|
Кстати если набивать, то парсить надо уже не строку. Это будет массив из N символов. Циклом что ли его потом перебрать?
|
Строка в Си - это и есть массив из символов, последним из которых является ноль, то бишь '/0' (и обратите внимание на пост Easyrider83).
Если во время "набивки" в прерывании этого самого массива обнаруживаем '/n' - в очередную позицию массива добавляем не '/n', а '/0', и больше ничего не добавляем, выставив флаг готовности строки - и у нас имя массива (без кавычек) - это и есть имя null-terminated строки, с которой можно работать посредством функций, объявленных в strings.h.
Но с точки зрения быстродействия выгоднее действительно перебирать этот массив-строку посимвольно.
Последний раз редактировалось AR_Favorit; 06.01.2017 в 06:39.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:42.
|
|