реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Поиск команды в массиве данных
MrYuran
сообщение Dec 4 2015, 10:26
Сообщение #16


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



AT команды


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 4 2015, 10:27
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(XVR @ Dec 4 2015, 10:24) *
Вам подойдет поиск по Регулярным Выражениям. Из всех ваших команд делается 1 регулярное выражение, из которого строится конечный автомат. Он (автомат) запускается на входной поток символов и выдает все совпадения за 1 проход над входной строкой (на лету)
Если вас устроит готовый парсер можете посмотреть в сторону flex - он генерирует готовый автомат


Да ладно... шаз мы будем рассказывать, что надо использовать Lexx, YACC, perfect hash, поиск по boyes moore, лексический анализ и прочие страшные вещи.. а потом выяснится, что у ТС команды сыпятся по 1200 8N1, обработка идет на двухядерном арме, и вся эта оптимизация с экономией тактов нафиг не нужна sm.gif

Сообщение отредактировал CrimsonPig - Dec 4 2015, 10:27
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 4 2015, 10:45
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(CrimsonPig @ Dec 4 2015, 13:27) *
а потом выяснится, что у ТС команды сыпятся по 1200 8N1, обработка идет на двухядерном арме, и вся эта оптимизация с экономией тактов нафиг не нужна sm.gif
Видимо нужна, иначе бы ТС с этот вопрос не задавал
Цитата
Да ладно... шаз мы будем рассказывать, что надо использовать Lexx, ... лексический анализ и прочие страшные вещи..
Они не такие страшные. Что бы воспользоваться flex'ом совсем не обязательно писать его (flex) самому - можно взять готовый rolleyes.gif А уж команды для flex'а написать в виде regexp'ов и вовсе простое дело beer.gif
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Dec 4 2015, 10:52
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(XVR @ Dec 4 2015, 10:45) *
Видимо нужна, иначе бы ТС с этот вопрос не задавал


Гы, тут ы соседнем топике есть товарищ.. уже полгода пытается оптимизировать код с точностью до такта, чтоб работало быстрее и потребляло меньше, только вот цикл while правильно до сих пор написать не может sm.gif
Go to the top of the page
 
+Quote Post
interrupt
сообщение Dec 4 2015, 11:56
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-02-08
Пользователь №: 35 466



За советы спасибо.

По поводу скорости. Обмен идет на 115200, обработка на STM32F100. Кроме этого контроллер загружен другими интерфейсами, обработкой прерываний, АЦП ну и т.п. Поэтому оптимизация времени обработки строки вроде бы актуальна.

Насчет AT команд. Ну примерно к этому и иду, но не понимаю, как их быстро разбирать. Ну вот есть у GSM-модуля огромный список этих команд. Контроллер выплевывает в него одну из них. Как он находит соответствие из всего перечня команд? Была у меня и такая мысль, делать группы команд, просто через обычный "if". Но получается очень громоздко и сложно при добавлении новых команд.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 4 2015, 12:30
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(MrYuran @ Dec 4 2015, 13:26) *
AT команды


Хороший подход. Все техзадания написаны и все стандартное.
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 4 2015, 12:39
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(interrupt @ Dec 4 2015, 14:56) *
Как он находит соответствие из всего перечня команд?
Trie дерево

Go to the top of the page
 
+Quote Post
interrupt
сообщение Dec 4 2015, 13:17
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-02-08
Пользователь №: 35 466



Цитата(XVR @ Dec 4 2015, 15:39) *


Похоже, в точку. Только пока не нашел, как это реализовать. Буду копать.
Go to the top of the page
 
+Quote Post
ДЕЙЛ
сообщение Dec 18 2015, 22:18
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085



Цитата(interrupt @ Dec 3 2015, 23:32) *
Такая задача. Контроллер принимает по UART некоторые данные в виде строк разной длины и содержания. Т.е. обычные текстовые строки. В этих строках может содержаться команда для контроллера, например: Switсh on out 7, input 1 disable, Led 11 on.
............

Если известна максимальная длина команды, то в обработчике прерыввания можно сделать буфер FIFO той же длины и с каждым входящим байтом анализировать именно это окно, а не весь массив. В GSM-модеме в конце каждой команды следует байт 0x0D, по которому обработчик прерывания устанавливает флаг, что принята команда и FIFO буфер нужно скопировать для последующего неспешного анализа, чтобы следующие приходящие байты не помешали. Если крутится операционка, то прерывание по определённому символу выдаёт семафор соответствующей задаче. Как-то так мне это представляется.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Dec 19 2015, 11:26
Сообщение #25


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(interrupt @ Dec 4 2015, 16:17) *
Похоже, в точку. Только пока не нашел, как это реализовать. Буду копать.

Там все гораздо проще - простой перебор sm.gif
По первому символу после сочетания "AT" определяется класс команды, а потом в соответствующей таблице ищется требуемая запись

Сообщение отредактировал Harvester - Dec 19 2015, 13:32
Прикрепленные файлы
Прикрепленный файл  80_VF696_1_B_AT_Command_Set_AMSS.pdf ( 1.02 мегабайт ) Кол-во скачиваний: 9
 


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Dec 19 2015, 13:22
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



привет,

особо не вдавался в советы форумчан (прочитал только первый пост)

вот кусок кода с ATMega (обработка прерывания)
int Flag_Sign_1 = NO;
int Flag_Sgn_OK = NO;
int Flag_Addr_Comm = NO;
char AddrCommand;
char Data;

ISR(USART_RXC_vect)
{
unsigned char RX_Data;
RX_Data = UDR;
if (RX_Data == 0xAA && Flag_Sign_1 == NO) // первая фаза получения сигнатуры
{
Flag_Sign_1 = YES;
return;
}
if (RX_Data == 0x55 && Flag_Sign_1 == YES) // вторая(конечная) фаза получения сигнатуры
{
Flag_Sgn_OK = YES;
return;
}
if (Flag_Sgn_OK = YES) // сигнатура принята переходим к декодированию адреса - команд - данных
{
if (Flag_Addr_Comm == NO) // получаем адрес - команду
{
Flag_Addr_Comm = YES;
AddrCommand = RX_Data;
return;
}
else // получаем данные и отправляем на декодирование
{
Data = RX_Data;
Decoder(AddrCommand, Data);
Flag_Addr_Comm = NO;
}
}
Flag_Sign_1 = NO;
Flag_Sgn_OK = NO;
}

YES и NO определены через define

в принципе из кода всё ясно, но если есть какие вопросы отвечу.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01448 секунд с 7
ELECTRONIX ©2004-2016