Приветствую! Очень часто сталкиваюсь с тем, что у новичков большие проблемы с пониманием логики работы с тем же Serial. Это порой выливается в полное непонимание того, почему код не работает как надо. Плюс - часто нужно делать совершенно тривиальные действия, например, по приходу какой-то команды из того же Serial установить значение переменной. Собственно, я тут с вопросом: понятное дело, что надо учиться и всё такое, для того, чтобы понимать, как оно устроено и как фунциклирует программирование вообще. Но! Вот подзадалбывает иногда, аж жуть. Можете сказать: задалбывает - не отвечай, и будете правы. Однако, есть и другой подход: написать и выложить сюда простейший парсер команд с минимальными настройками, который будет работать с Stream* и выдавать вовне нужные значения, например: пришло в порт "var1=12345\r\n", и парсер выдал, что есть команда с именем "var1" и параметром "1234". Т.е. чтобы в парсере настраивался разделитель команды и параметра, а также разделитель команд. Что скажете - стоит потратить часок времени и выложить сюда, по сути, велосипед? С надеждой, что его юзанье поможет новичкам не задавать в стопицотый раз вопрос "почему не работает?". Или - сделаем только хуже, убрав ещё один бастион, помогающий обучаться и понимать, как оно работает?
В общем, вот вам всем, смотрите приложенный архив. Тестировал, посылая в Serial параметры со значениями: param1=1234\\r\n param1=value1¶m2=value2¶m3=value3\r\n param1=\r\n Разделитель имени и параметра - настраиваемый. Разделители команд между собой - настраиваемые. Времени на написание потратил - минут 10. Класс снимает все головняки с получением команд с любого Stream, кмк. Будут замечания - пишите, а я пока буду отсылать в эту тему всех, кто сталкивается с проблемой вычитки данных из Stream и разбором их на пары "ключ-значение". З.Ы. Код неоптимальный, кому надо - сам допилит (лично мне совсем не нравится постоянное дёрганье strlen по приходу команды, но это мелочи, по сути). З.З.Ы. Тестовый скетч - в комплекте.
Это точно Но я попытаюсь, хотя бы часть головняков снять по вдалбливанию одного и того же. И это, с одной стороны, даже хорошо - чем меньше будет людей, понимающих, как оно работает, тем больше у мну будет работы
Есть же готовые библиотеки: https://habrahabr.ru/post/127890/ http://bitlash.net P.S. Может пригодится: http://www.gammon.com.au/serial
Как показывает практика, не малое количество "программистов" вместо того, что бы попробовать поискать решение задачи, сразу идут на форум и задают вопрос. Поэтому Ваше предложение хорошее, но вскоре тема "уйдёт" далеко и просматривать её больше ни кто не будет, а подобные вопросы всё равно на форуме будут появляться. Как вариант -- заведите аккаунт на https://github.com/ (если ещё не завели), и выкладывайте свои наработки. А как только появиться очередной "программист", то сразу ему ссылку на проект, где он сможет получить полезную информацию. Несколько советов: лучше использовать связку файлов *.cpp + *.h, а не *.ino + *.h; в конструктор передаётся поток (Stream), а в функцию 'begin' параметры парсинга -- скорее следует сделать наоборот -- в конструктор передавать параметры парсинга, а в функцию 'begin' поток, т.к. параметры парсинга задаются один раз, а потоков, которые надо одинаково парсить, может быть несколько; с классом String (поле workBuffer) надо быть поаккуратней, этот класс динамически выделяет память под хранение строк, а с динамическим выделением память в AVR-ках нужно работать осторожно.
В *.ino там просто тестовый пример, сам класс - весь в *.h реализован Ну тут, что называется, на любителя , писал по-бырому, как уже упоминал. Ипстественно, но это уже не моя головная боль - не буду же я все-все-все проблемы решать Кто повдумчивей - поймёт, что надо бы сделать guard на максимальную длину буфера, как минимум. З.Ы. Аккаунт на гитхабе есть (проект в подписи), но выкладывать туда сии поделия - надо подумать хорошо Впрочем, в вашем предложении есть здравое зерно.
Здесь с Вами не согласился бы. Юзвери делятся на тех, кто "дайте мне библиотеку и как ее соединить"; интересно, как он это сделал; это и без него известно. Первые думать не будут в силу привычки, вторые не подумают в силу неопытности. А опытным и так это понятно. Поэтому, если уж объясняете - лучше уж до конца (во имя маленькой, но очень благодарной второй группы )
Дык вроде указал, что для совсем кошерности - надо просто вставить ещё проверку, чтобы длина буфера, в которую складываем символы, была ограничена каким-то разумным значением, и если она (длина) превышает это разумное значение - принудительно чистить буфер. Это нужно для предотвращения "спама", скажем так - когда в поток ооочень долго не приходит разделитель команд. Делов - одну проверку в update вставить, любой справится, я думаю.
Обновил на гитхабе: https://github.com/Porokhnya/ArduinoParamsFromStream - добавил проверку на максимальную длину буфера, уж пусть будет поаккуратнее
А описание на ангЕльском это политика гитхаба? Или по привычке? Тут очень много тех кто с Русским то ещё не подружился)))) А от себя, респект и уважуха за терпение и помощь.
Да как-то решил, что на буржуйском интернациональней, что-ли Если что - всё равно вопросы будут задавать, отвечу, чего уж там
Да русский это всегда хорошо, особенно в комментариях .Ну на буржуйском многие по русски и пишут, чтобы свои не мучились, а вот буржуи пусть голову ломают. ps\ для меня русский это и есть интернациональный.