-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|||||||||||
1 | |||||||||||
Как писать парсер строки под дуино?24.10.2017, 05:35. Показов 1609. Ответов 19
Метки нет (Все метки)
где можно почитать о создании парсера именно для мк ардуино? ну там же память надо экономить туда сюда... не хочу чтобы он занимал более 20%
парсить буду ответ смарт карты в формате TLV тоесть из вот такого
на что в первую очередь обратить внимание? посоветуйте статьи и публикации на тему парсеров под ардуино.
0
|
24.10.2017, 05:35 | |
Ответы с готовыми решениями:
19
Как писать сложный парсер? Как писать под RockBox? Как писать под windows? Как писать плугины на С++ под RRose? |
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
24.10.2017, 11:14 | 2 |
Как правило такая задача решается построением автомата состояний. То есть вы в зависимости от предшествующего ввода меняете состояние своего автомата и соответствующим образом интерпретируете следующий байт. В базовом виде, без украшательств, получается длинный switch-case-if-else-goto... Есть более академические подходы к построению парсеров, но тут они избыточны.
Добавлено через 26 минут Собственно, такой автомат побайтно получает данные и в зависимости от них изменяет своё состояние.
1
|
58 / 34 / 8
Регистрация: 08.07.2011
Сообщений: 235
|
|
26.10.2017, 08:03 | 3 |
SadiQ228, вообще есть куча решений, начиная от регулярок и заканчивая собственными велосипедами.
Начинать надо с того, что у вас все таки строка имеет статичный размер или нет? Грубо говоря первый и 3й байт всегда останутся на своем месте и например 15й или все таки после 3го байта может быть менее 14 байт? Если все статично, то в чем вообще проблема выделить свои буфера статичные под эту строку и дергать уже в каждый буфер инфу по своим индексам? Если же происходит сдвиг всех идентификаторов в зависимости от размера информации, то придется вылавливать по всей строке эти идентификаторы и то что следует за ними.
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
26.10.2017, 11:29 | 4 |
А, кстати да... Разбор пакета гораздо проще автомата состояний... Если пакет полностью принять.
0
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
26.10.2017, 20:30 [ТС] | 5 |
ну в зависимости от команды строка приходить мне будет постоянно разная
0
|
58 / 34 / 8
Регистрация: 08.07.2011
Сообщений: 235
|
|
27.10.2017, 04:20 | 6 |
строка то понятно что разная - я спрашивал про длину строки???
между байтом со значением 84 и байтом A5 статичная длина этого массива данных?
0
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
27.10.2017, 16:09 [ТС] | 7 |
длина строки да статичная, максимальная ну чтобы все вошло....
это да длина данных, значение которой мы видим в 0e
0
|
27.10.2017, 16:23 | 8 |
Взять книги по С или С++ ?
Зачем экономить ? Экономить надо когда ее начинает хватать. Добавлено через 2 минуты Для начала стоит найти точное описание формата и по нему делать.
0
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
27.10.2017, 16:35 [ТС] | 9 |
спасибо Кэп
0
|
58 / 34 / 8
Регистрация: 08.07.2011
Сообщений: 235
|
||||||
27.10.2017, 19:28 | 10 | |||||
значит нечего изобретать велосипед - в твоем случае ты знаешь индексы нужных тебе байтов и данных следующих за ними..
У тебя в любом случае 84 определен индексом 3, а 4й индекс у тебя содержит размер твоей всей строки, хотя это по сути и не надо вот и делай что то наподобии такого Я парсил PDUS формат GSM модема, получается что то типа такого - создал структуру и в нее пихаешь данные, а индексы твои это разделители.
1
|
8 / 8 / 2
Регистрация: 01.10.2017
Сообщений: 49
|
||||||
01.11.2017, 20:26 | 11 | |||||
По хорошему - надо сделать struct и заполнять уже его. Но в силу ограниченности ресурсов - проще в цикле читать данные из консоли и обрабатывать их по мере поступления.
Скажем, формат такой:
Тоесть читаем через Serial.read() по 3 символа, первые два конвертиуем в число через atoi(), получаем тип данных (Строка), читаем снова 3 символа, первые 2 конвертим в число, получаем длинну (14). Создаем char *string и считываем 14 раз по 3 байта, ковертируя первые 2 в сивол (*string = convertedChar; *string++). Последним будет NULL (0x00) - тоесть конец строки. (Тут оговорка - можно было бы читать до NULL, тогда и байт длины строки не нужен. Но это уже другая история). Кажысь все верно расписал. Хотя и без кода.
1
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
03.11.2017, 00:04 [ТС] | 12 |
друг подскажи у меня Тэгов около ста штук.... плюс еще и их имена.... типо вот такие ....как в примере:
0
|
8 / 8 / 2
Регистрация: 01.10.2017
Сообщений: 49
|
||||||||||||||||
03.11.2017, 00:54 | 13 | |||||||||||||||
Далее делаем массив, сохраненный в флеш-памяти (eeprom):
... Пишу по памяти, может немного ошибся...
1
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|||||||||||
04.11.2017, 18:01 [ТС] | 14 | ||||||||||
а вот еще такой вопросик как лучше организовать приставку следующего бита?
объясняю:
привожу пример:
как бы решить такое объединение байтов? сижу вот думаю чет на ум не приходит ничего
0
|
8 / 8 / 2
Регистрация: 01.10.2017
Сообщений: 49
|
||||||
04.11.2017, 20:37 | 15 | |||||
Поправлю код:
1
|
Модератор
8951 / 6717 / 921
Регистрация: 14.02.2011
Сообщений: 23,714
|
||||||
04.11.2017, 21:13 | 16 | |||||
лучше писать
и тогда если возникнет нужда поменять тип массива с int на char или float не надо будет по всему листингу править
1
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
05.11.2017, 04:02 [ТС] | 17 |
а по другому кроме как заводить еще один массив никак?
0
|
8 / 8 / 2
Регистрация: 01.10.2017
Сообщений: 49
|
|
05.11.2017, 09:43 | 18 |
Неа. После компиляции enum перестаёт существовать: Все перечисленыне в нем переменные заменяются по всему коду на их значения - тоесть везде, где вы писали "TMP_FCI" будет подставлено "0x00".
Соответственно, если гдето используется switch-case со значениями из enum - то все эти значения будут в оперативной памяти, а не на флеше (Памяти программы / eeprom). По этому и приходится всячески извращаться...
1
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
12.11.2017, 03:45 [ТС] | 19 |
дабы не плодить новых тем хочу спросить следующее: а как засечь в ms время выполнения функции на ардуино? вот я получил строку, у меня есть рабочая ( таки да) функция которая раскладывает строку... и как засечь сколько времени нужно моей функции от получения строки до полного разбора ее по пакетам?
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
12.11.2017, 08:06 | 20 |
Перед вызовом функции с помощью функции micros() снимаете время в микросекундах. По выходу их функции снимаете отметку второй раз. Разница между отметками и есть интервал времени (с точностью до затрат на снятие меток)
Если функция выполняется слишком быстро, то единичный прогон может быть малоинформативен. Тогда делаем снимаем интервал над выполнением цикла из 100-1000 выполнений функции.
1
|
12.11.2017, 08:06 | |
12.11.2017, 08:06 | ||||||
Помогаю со студенческими работами здесь
20
Как начать писать под iOS? Как писать в python 3 под java? Как писать под Android в Eclipse? Как писать резиденты под винду Как писать приложения под андроид? С чего начать писать парсер на С++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи | |||||
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
|
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
|
Как определить, содержит ли строка подстроку в JavaScript
InfoMaster 19.01.2025
При разработке веб-приложений часто возникает необходимость выполнять различные операции со строками, среди которых особое место занимает поиск подстрок. JavaScript предоставляет несколько встроенных. . .
|
Что такое метаклассы в Python
InfoMaster 19.01.2025
Метаклассы в Python представляют собой один из самых мощных и одновременно сложных механизмов языка, позволяющий программистам контролировать процесс создания классов. По своей сути, метакласс. . .
|
Как удалить свойство из объекта JavaScript
InfoMaster 19.01.2025
В современной веб-разработке объекты JavaScript играют фундаментальную роль в организации и структурировании данных. Они представляют собой контейнеры, которые хранят связанные данные и. . .
|
Какая разница между String и string в C#
InfoMaster 19.01.2025
В языке программирования C# существует интересная особенность: для работы со строками можно использовать как String, так и string. Эта двойственность часто вызывает вопросы у разработчиков, особенно. . .
|
Как в Git откатить репозиторий к предыдущему коммиту
InfoMaster 19.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, предоставляя разработчикам мощные инструменты для управления изменениями в. . .
|
Как работают замыкания (closure) в JavaScript
InfoMaster 19.01.2025
В мире современной веб-разработки замыкания (closures) представляют собой один из фундаментальных концептов языка JavaScript, который часто вызывает затруднения у начинающих разработчиков, но при. . .
|
Как в Linux найти все файлы, содержащие указанную строку
InfoMaster 19.01.2025
Операционная система Linux предоставляет мощный набор инструментов для поиска текста в файлах, каждый из которых имеет свои уникальные возможности и особенности применения. Центральное место среди. . .
|
Как поменять сообщение коммита в Git
InfoMaster 19.01.2025
Правильно оформленные сообщения коммитов существенно упрощают процесс разработки, особенно при работе в команде или при необходимости вернуться к более ранним версиям проекта. Каждое сообщение. . .
|
Как лучше объявлять функции в JavaScript: var functionName = function() {} или function functionName() {}
InfoMaster 19.01.2025
В мире современной веб-разработки JavaScript играет ключевую роль, предоставляя разработчикам мощные инструменты для создания динамических и интерактивных веб-приложений. Одним из фундаментальных. . .
|
Как сделать редирект на другую веб-страницу
InfoMaster 19.01.2025
В современной веб-разработке редирект является неотъемлемым инструментом для управления навигацией пользователей между страницами сайта. Перенаправление представляет собой автоматическое перемещение. . .
|