Разбор параметров ключ-значение из любого Stream
- Войдите на сайт для отправки комментариев
Вот, собственно, наколенный лисапед, т.к. подзадолбали вопросы типа "как мне получить из Serial параметр и сохранить его в переменную?": https://github.com/Porokhnya/ArduinoParamsFromStream
Разделитель между именем параметра и параметром - настраиваемый. Разделитель параметров между собой - настраиваемый. По умолчанию работает как парсер параметров URI-запроса, т.е. "param=value¶m2=value2" и т.д. Обвязка минимальная, просто выплёвывает в пользовательскую функцию распарсенные значения в виде строк, чего с ними дальше делать - каждый ССЗБ. Тестовый скетч:
//------------------------------------------------------------------------------------------- #include "CommandsParser.h" //------------------------------------------------------------------------------------------- /* Simple "key=value" params parser example. */ //------------------------------------------------------------------------------------------- CommandsParser cParser(Serial); // parse from Serial //------------------------------------------------------------------------------------------- void paramsHandler(const char* param, const char* value) { Serial.print("Received: param="); Serial.print(param); Serial.print("; value="); Serial.println(value); } //------------------------------------------------------------------------------------------- void setup() { Serial.begin(9600); cParser.begin(paramsHandler); } //------------------------------------------------------------------------------------------- void loop() { cParser.update(); } //-------------------------------------------------------------------------------------------
Можно в мониторе порта повводить ручками параметры, типа param1=<ENTER>, param=val¶m2=1234<ENTER>, где <ENTER> - клавиша ENTER на клаве, и посмотреть, что выплёвывается обратно.
Есть защита от переполнения памяти. Писалось быстро, минут за 10, прошу воспринимать как стартовую точку, а не грамотное законченное решение.
Посмотрел код. В принципе верно. Но не оптимально. Для старта весьма убедительно.
Что бы я менял:
1. Буфер нафиг, у нас не настолько много памяти чтоб workBuffer держать между вызовами.
2. Названия параметров заменять их идентификатором и пихать байтовый идентификатор в вызова pUserFunc. Как правило в скетче поддерживается определенное количество известных ему параметров и их названия хранятся а затем сравниваются с поступившими. Этот функционал целессообразно внести в парсер. Чем ранше перейти от строки в названии параметра к идентификатору, тем компактней будет код. Но реализованый подход тоже имеет право на жизнь, например произвольный параметр отобразить на экране вместе с именем и т.д. Потому неплохо иметь оба варианта.
подписался. как раз нужно нечто подобное. буду следить за продолжением...
подписался. как раз нужно нечто подобное. буду следить за продолжением...
Да чего там продолжать? Берите, усовершенствуйте, оптимизируйте, я не против, даже наоборот.