Как парсить строку arduino

Обрабатываем строки на Arduino

Я пришел к программированию в целом, и программированию Arduino в частности, полным нулем, около двух месяцев назад. Сейчас же, по ходу своей текущей деятельности я ощутил необходимость в освоении обработки строк на ардуино. Обычный поход в Google за информацией не обрадовал статьей, где все просто и понятно для чайников написано. И поэтому я здесь для того, чтобы рассказать о том, каким образом был реализован парсинг строк из последовательного порта и какие были встречены на пути подводные камни. Интересующихся прошу под кат.

Итак. Вот примерный алгоритм, которому я следовал:

  1. Идем на arduino.ru и высматриваем в колонке типов все, связанное с символами.
    • Тип данных char
    • Текстовые строки как массив символов
    • Созданный в версии 0.0.19 объект String

  2. Решаем, какую форму представления будем использовать (Я остановился на классе String, т.к. имел неприятный опыт с месивом массивом).
  3. Судорожно пытаемся написать свою функцию с преферансом и профурсетками
  4. Ищем подробное описание класса.
  5. Ищем нужные операторы.
  6. Пишем!

А алгоритм работы основного тела программы прост:

  1. Циклично проверяем, есть ли в буфере com порта доступный для чтения байт, если есть, читаем.
  2. Если принятый байт — символ переноса строки (‘\n’), то вызываем самописную функцию парсинга, если же нет, то добавляем принятый байт в созданную переменную типа String.

Так, я не понял, что за дела? Почему не загорается светодиод? Ах да, как же это я запамятовал, в void setup нужно добавить:

Источник

Обрабатываем строки на Arduino

Я пришел к программированию в целом, и программированию Arduino в частности, полным нулем, около двух месяцев назад. Сейчас же, по ходу своей текущей деятельности я ощутил необходимость в освоении обработки строк на ардуино. Обычный поход в Google за информацией не обрадовал статьей, где все просто и понятно для чайников написано. И поэтому я здесь для того, чтобы рассказать о том, каким образом был реализован парсинг строк из последовательного порта и какие были встречены на пути подводные камни. Интересующихся прошу под кат.

Итак. Вот примерный алгоритм, которому я следовал:

  1. Идем на arduino.ru и высматриваем в колонке типов все, связанное с символами.
    • Тип данных char
    • Текстовые строки как массив символов
    • Созданный в версии 0.0.19 объект String

  2. Решаем, какую форму представления будем использовать (Я остановился на классе String, т.к. имел неприятный опыт с месивом массивом).
  3. Судорожно пытаемся написать свою функцию с преферансом и профурсетками
  4. Ищем подробное описание класса.
  5. Ищем нужные операторы.
  6. Пишем!

А алгоритм работы основного тела программы прост:

  1. Циклично проверяем, есть ли в буфере com порта доступный для чтения байт, если есть, читаем.
  2. Если принятый байт — символ переноса строки (‘\n’), то вызываем самописную функцию парсинга, если же нет, то добавляем принятый байт в созданную переменную типа String.

Так, я не понял, что за дела? Почему не загорается светодиод? Ах да, как же это я запамятовал, в void setup нужно добавить:

Источник

GyverLibs/GParser

Use Git or checkout with SVN using the web URL.

Work fast with our official CLI. Learn more.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Простой и быстрый парсер строк в отдельные подстроки и числа для Arduino

  • Работает с указанным буфером (строкой), не создаёт свой
  • Разделяет строку на подстроки по указанному символу
  • Позволяет обращаться к подстрокам, переводить их в числа и сравнивать со строками
  • Доступ к подстрокам через []
  • Может распарсить строку в массив int или byte

Совместима со всеми Arduino платформами (используются Arduino-функции)

  • Библиотеку можно найти по названию GParser и установить через менеджер библиотек в:
    • Arduino IDE
    • Arduino IDE v2
    • PlatformIO
  • Скачать библиотеку .zip архивом для ручной установки:
    • Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
    • Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
    • Распаковать и положить в Документы/Arduino/libraries/
    • (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
  • Читай более подробную инструкцию по установке библиотек здесь
  • Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
  • Через менеджер библиотек IDE: найти библиотеку как при установке и нажать «Обновить»
  • Вручную: удалить папку со старой версией, а затем положить на её место новую. «Замену» делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

Отдельные функции парсинга

См. пример testUtils

См. пример testUnicode

См. пример testUrl

Остальные примеры смотри в examples!

  • v1.0
  • v1.1 — добавлены отдельные инструменты для парсинга
  • v1.2 — добавлены ещё инструменты для парсинга
  • v1.3 — добавлена возможность восстановить строку
  • v1.3.1 — фикс warning
  • v1.4 — добавил url и unicode кодирование

Баги и обратная связь

При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request‘ов!

При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:

  • Версия библиотеки
  • Какой используется МК
  • Версия SDK (для ESP)
  • Версия Arduino IDE
  • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
  • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
  • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код

About

Простой и быстрый парсер строк в отдельные подстроки и числа для Arduino

Источник

Отправка и парсинг Serial

Общение по Serial

Данный урок переехал из урока о мониторе порта, рекомендуется сначала изучить его. Стандартные инструменты “библиотеки” Serial позволяют отправлять и принимать данные по интерфейсу UART. Здесь мы рассмотрим некоторые алгоритмы и протоколы связи, чтобы наладить управление программой через монитор порта в ручном режиме, или использовать для этого специальные программы, а также приложение на смартфоне и Bluetooth-UART модули. Между двумя Ардуинами, или между Ардуино и другим МК (esp8266, STM32) можно общаться по Serial. Для этого нужно соединить их следующим образом:

  • Соединить GND, ибо сигнал не ходит по одному проводу.
  • Для односторонней связи соединить дата-пины у отправителя -> приёмника как TX -> RX.
    • Сериал может быть как аппаратный (пины подписаны на плате), так и программный, например встроенная библиотека SoftwareSerial.h. У неё пины указываются вручную.
  • Для двухсторонней связи нужно соединить также RX -> TX.
    • Внимание! Если прошивка загружается через аппаратный юарт, например TX RX на Arduino Nano, то пин RX нужно освободить, иначе прошивка не загрузится.

Для передачи данных между платами можно использовать разобранные выше функции и разобранные ниже алгоритмы, но я хочу показать вам один особенно удобный способ передачи структур данных при помощи стандартных средств ядра Ардуино. Напомню, структура представляет собой набор данных из любых типов, что очень удобно для передачи разных данных. Отправка данных осуществляется при помощи Serial.write(байтовый буфер, размер) , а приём – при помощи Serial.readBytes(байтовый буфер, размер) . Минус readBytes заключается в том, что она блокирующая: выполнение кода не идёт дальше, пока функция не примет указанное количество байт или не завершит работу по таймауту, про таймаут написано выше в этом уроке. Обе функции принимают байтовый буфер, но мы с вами знаем про указатели и их типы, поэтому можем обманом (byte*) заманить структуру в отправку и чтение. Ниже показываю примеры как отправить и принять структуру с одной Ардуины на другую при помощи SoftwareSerial, таким же образом можно использовать обычный аппаратный Serial. Также поделюсь примером отправки и чтения с контролем целостности данных – CRC, который сильно повышает надёжность передачи: позволит распознать ошибку в пакете, если хоть один бит был передан или принят неправильно. Примеры будут работать на любых Ардуино-совместимых платах, в том числе на базе esp8266. С ней есть некоторые особенности, о них расскажу ниже.

  • Тип данных int занимает на esp 4 байта, то есть Ардуина должна принимать этот тип как long .
  • Компилятор esp очень странно пакует байты в структуру, поэтому однобайтные типы данных нужно размещать в конце структуры. Например так:

Другие алгоритмы парсинга

В реальном устройстве часто требуется передавать несколько параметров, например у нас Bluetooth танк. Мы ему должны отправить например скорость правой гусеницы, скорость левой гусеницы, положение башни, состояние подсветки, команду на выстрел… Да что угодно. Как быть в таком случае? Тут начинается настоящий парсинг, и появляются варианты, нам придётся придумывать собственный протокол связи. Есть два базовых варианта: отправка пакета всех-всех данных и его парсинг, или отправка отдельно каждого параметра с уникальным “ключом” у каждого. Как это понимать: суть первого варианта состоит в принятии пакета данных, которые разделены разделителем. Также правильно будет выделить начало и конец посылки. Пример: $120 80 180 1; – начальный символ $, разделитель ” ” (пробел) и завершающий символ ; . Наличие начального и завершающего символа повышает скорость работы и помехозащищённость связи. Второй вариант – посылки вида MOT1_120, содержащие ключ и значение, соответствующее этому ключу. Как реализовать данные способы парсинга я очень подробно разбирал в примерах в сборнике полезных алгоритмов Arduino, раздел “Работа с Serial”. Но давайте я оставлю их также и здесь, пользуйтесь!

Источник

Arduino (C language) parsing string with delimiter (input through serial interface)

Arduino (C language) parsing string with delimiter (input through serial interface)

Didn’t find the answer here :/

I want to send to my arduino through a serial interface (Serial.read()) a simple string of three numbers delimited with comma. Those three numbers could be of range 0-255.

Eg. 255,255,255 0,0,0 1,20,100 90,200,3

What I need to do is to parse this string sent to arduino to three integers (let’s say r, g and b).

So when I send 100,50,30 arduino will translate it to

I tried lots of codes, but none of them worked. The main problem is to translate string (bunch of chars) to integer. I figured out that there will probably be strtok_r for delimiter purpose, but that’s about it.

Thanks for any suggestions :)

9 Answers 9

To answer the question you actually asked, String objects are very powerful and they can do exactly what you ask. If you limit your parsing rules directly from the input, your code becomes less flexible, less reusable, and slightly convoluted.

Strings have a method called indexOf() which allows you to search for the index in the String’s character array of a particular character. If the character is not found, the method should return -1. A second parameter can be added to the function call to indicate a starting point for the search. In your case, since your delimiters are commas, you would call:

Then you could use that index to create a substring using the String class’s substring() method. This returns a new String beginning at a particular starting index, and ending just before a second index (Or the end of a file if none is given). So you would type something akin to:

Finally, the integer values can be retrieved using the String class’s undocumented method, toInt():

More information on the String object and its various methods can be found int the Arduino documentation.

Источник

Adblock
detector