Разбор параметров ключ-значение из любого Stream

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вот, собственно, наколенный лисапед, т.к. подзадолбали вопросы типа "как мне получить из Serial параметр и сохранить его в переменную?": https://github.com/Porokhnya/ArduinoParamsFromStream

Разделитель между именем параметра и параметром - настраиваемый. Разделитель параметров между собой - настраиваемый. По умолчанию работает как парсер параметров URI-запроса, т.е. "param=value&param2=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&param2=1234<ENTER>, где <ENTER> - клавиша ENTER на клаве, и посмотреть, что выплёвывается обратно.

Есть защита от переполнения памяти. Писалось быстро, минут за 10, прошу воспринимать как стартовую точку, а не грамотное законченное решение.

Logik
Offline
Зарегистрирован: 05.08.2014

Посмотрел код. В принципе верно. Но не оптимально. Для старта весьма убедительно.

Что бы я менял:

1. Буфер нафиг, у нас не настолько много памяти чтоб workBuffer держать между вызовами. 

2. Названия параметров заменять их идентификатором и пихать байтовый идентификатор в вызова pUserFunc. Как правило в скетче поддерживается определенное количество известных ему параметров и их названия хранятся а затем сравниваются с поступившими. Этот функционал целессообразно внести в парсер. Чем ранше перейти от строки в названии параметра к идентификатору, тем компактней будет код. Но реализованый подход тоже имеет право на жизнь, например произвольный параметр отобразить на экране вместе с именем и т.д. Потому неплохо иметь оба варианта.

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

подписался. как раз нужно нечто подобное. буду следить за продолжением...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Mr.Privet пишет:

подписался. как раз нужно нечто подобное. буду следить за продолжением...

Да чего там продолжать? Берите, усовершенствуйте, оптимизируйте, я не против, даже наоборот.