ВНИМАНИЕ, БИБЛИОТЕКА УСТАРЕЛА! ИСПОЛЬЗУЙ БИБЛИОТЕКУ StringUtils, ОНА ИМЕЕТ БОЛЬШЕ ВОЗМОЖНОСТЕЙ |
---|
Простой и быстрый парсер строк в отдельные подстроки и числа для 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: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
// передать char array строку, можно указать символ разделитель (по умолч ',')
GParser (char* data);
GParser (char* data, char newDiv = ',');
void setDiv(char newDiv); // указать символ разделитель
void clear(); // освободить буфер
int amount(); // количество разделённых данных в пакете
int split(); // разделить строку на подстроки
int32_t getInt(int num); // получить инт из выбранной подстроки
float getFloat(int num); // получить float из выбранной подстроки
bool equals(int num, const char* comp); // сравнить подстроку с другой строкой
int parseBytes(byte* data); // распарсить на байты
int parseInts(int* data); // распарсить на инты
int parseLongs(long* data); // распарсить на лонги
void restore(); // восстановить исходный вид строки (вернуть разделители)
См. пример testUtils
// количество подстрок в списке list с разделителем div
uint8_t GP_listSize(char* list, char div = ',');
// разделить список list с разделителем div на подстроки (см. пример)
char* GP_splitList(char* list, char div = ',');
// получить номер, под которым name входит в list с разделителем div. -1 если не входит
int8_t GP_inList(char* name, char* list, char div = ',');
// преобразовать int в строку (работает в 3-10 раз быстрее ltoa + основание)
void GP_numToChar(int32_t n, char* buf, uint8_t base);
// преобразовать float в строку
void GP_floatToChar(double f, char *buf, uint8_t decimals);
// преобразовать строку в число
int32_t GP_charToNum(char* buf, uint8_t base);
// преобразовать строку в float
double GP_charToFloat(char* buf);
// получить число под индексом idx в списке list с разделителем div
int GP_numFromList(char* list, int idx, char div = ',');
// переписать список list с разделителем div в массив чисел data размером size
uint8_t GP_listToNum(char* list, int* data, uint8_t size, char div = ',');
// преобразовать текстовый цвет (0x, #) в число
uint32_t GP_decodeColor(char* hex);
См. пример testUnicode
char* GP_uniencode(int32_t c, char* s); // код unicode в char[5]
String GP_uniencode(uint16_t c); // код unicode в String
uint16_t GP_unistrlen(char* data); // длина unicode строки в кол-ве символов
См. пример testUrl
void GP_urlencode(const String& s, String& dest); // urlencode из String в String
String GP_urlencode(const String& s); // urlencode из String в String (возврат)
String GP_urldecode(const String& s, String& dest); // urldecode из String в String
String GP_urldecode(const String& s); // urldecode из String в String (возврат)
Остальные примеры смотри в examples!
// тест парсера строк
#include <GParser.h>
void setup() {
Serial.begin(9600);
// ==================== ПРИМЕР 1 ======================
// строка для примера
// данные разделены разделителем, например запятой
// могут быть получены из Serial/UDP/TCP/MQTT итд
char str[] = "1234,3.14,hello,4567,lolkek,qwerty";
// кормим строку парсеру, указываем разделитель (умолч. запятая)
GParser data(str, ',');
// разделяем
// ВНИМАНИЕ! Операция "ломает" строку, заменяя разделители на NULL
int am = data.split();
// получаем количество данных
Serial.println(am); // выводим количество
// можем обратиться к полученным строкам как data[i] или data.str[i]
for (byte i = 0; i < am; i++) Serial.println(data[i]);
// также можно получить их в виде int и float чисел
// передав индекс строки
Serial.println(data.getInt(0));
Serial.println(data.getFloat(1));
// можно сравнить со строкой (номер парс строки, строка для сравнения)
if (data.equals(2, "hello")) Serial.println("true");
else Serial.println("false");
Serial.println();
// ==================== ПРИМЕР 2 ======================
// быстрый парсинг целочисленных данных с разделителем
char str2[] = "123,456,789,222,333,444";
GParser data2(str2); // кормим строку парсеру
// создаём массив с количеством ячеек data2.amount() - столько данных в пакете
int ints[data2.amount()];
int am2 = data2.parseInts(ints); // раскидает в указанный массив и вернёт количество
// фактически тут am2 == data2.amount() - количество данных
// выводим
for (byte i = 0; i < am; i++) Serial.println(ints[i]);
}
void loop() {
}
- v1.0
- v1.1 - добавлены отдельные инструменты для парсинга
- v1.2 - добавлены ещё инструменты для парсинга
- v1.3 - добавлена возможность восстановить строку
- v1.3.1 - фикс warning
- v1.4 - добавил url и unicode кодирование
- v1.5 - getInt теперь возвращает int32_t
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код