|
Поиск команды в массиве данных |
|
|
|
Dec 4 2015, 10:27
|

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

|
Цитата(XVR @ Dec 4 2015, 10:24)  Вам подойдет поиск по Регулярным Выражениям. Из всех ваших команд делается 1 регулярное выражение, из которого строится конечный автомат. Он (автомат) запускается на входной поток символов и выдает все совпадения за 1 проход над входной строкой (на лету) Если вас устроит готовый парсер можете посмотреть в сторону flex - он генерирует готовый автомат Да ладно... шаз мы будем рассказывать, что надо использовать Lexx, YACC, perfect hash, поиск по boyes moore, лексический анализ и прочие страшные вещи.. а потом выяснится, что у ТС команды сыпятся по 1200 8N1, обработка идет на двухядерном арме, и вся эта оптимизация с экономией тактов нафиг не нужна
Сообщение отредактировал CrimsonPig - Dec 4 2015, 10:27
|
|
|
|
|
Dec 4 2015, 11:56
|
Участник

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

|
За советы спасибо.
По поводу скорости. Обмен идет на 115200, обработка на STM32F100. Кроме этого контроллер загружен другими интерфейсами, обработкой прерываний, АЦП ну и т.п. Поэтому оптимизация времени обработки строки вроде бы актуальна.
Насчет AT команд. Ну примерно к этому и иду, но не понимаю, как их быстро разбирать. Ну вот есть у GSM-модуля огромный список этих команд. Контроллер выплевывает в него одну из них. Как он находит соответствие из всего перечня команд? Была у меня и такая мысль, делать группы команд, просто через обычный "if". Но получается очень громоздко и сложно при добавлении новых команд.
|
|
|
|
|
Dec 4 2015, 13:17
|
Участник

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

|
Цитата(XVR @ Dec 4 2015, 15:39)  Похоже, в точку. Только пока не нашел, как это реализовать. Буду копать.
|
|
|
|
|
Dec 18 2015, 22:18
|
Местный
  
Группа: Участник
Сообщений: 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 буфер нужно скопировать для последующего неспешного анализа, чтобы следующие приходящие байты не помешали. Если крутится операционка, то прерывание по определённому символу выдаёт семафор соответствующей задаче. Как-то так мне это представляется.
|
|
|
|
|
Dec 19 2015, 11:26
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(interrupt @ Dec 4 2015, 16:17)  Похоже, в точку. Только пока не нашел, как это реализовать. Буду копать. Там все гораздо проще - простой перебор  По первому символу после сочетания "AT" определяется класс команды, а потом в соответствующей таблице ищется требуемая запись
Сообщение отредактировал Harvester - Dec 19 2015, 13:32
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|