Для разделения последовательности символов на отдельные фрагменты используйте функцию strtok(). Она принимает два аргумента: исходный текст и разделитель. Например, char *token = strtok(data, «,»); вернет первую часть до запятой. Повторные вызовы с NULL вместо data продолжат разбивку.
Если требуется преобразовать символы в числовое значение, применяйте atoi() или atof(). Для «123» результат будет 123. Учтите: эти функции не обнаруживают ошибки. Для проверки корректности разбора подойдет sscanf() с шаблоном «%d».
При работе с последовательностями, передаваемыми через UART, сохраняйте входящие байты в буфер. Контролируйте переполнение: byte buffer[64]; if (Serial.available()) { buffer[i++] = Serial.read(); }. Добавьте таймаут для определения конца передачи.
Содержание материала
Извлечение данных из текстовых команд
Для разделения символов по разделителю используйте String::indexOf() и String::substring(). Например, чтобы разбить «A=123;B=456» по точкам с запятой:
String input = "A=123;B=456";
int separator = input.indexOf(';');
String part1 = input.substring(0, separator);
String part2 = input.substring(separator + 1);
Если требуется выделить числовые значения, преобразуйте фрагмент в int или float через toInt():
int valueA = part1.substring(2).toInt(); // Получит 123
Для сложных форматов, таких как JSON, подключите библиотеку ArduinoJson. Десериализация работает так:
StaticJsonDocument<200> doc;
deserializeJson(doc, "{"temp":25.5}");
float temperature = doc["temp"];
При работе с последовательным портом читайте данные до символа конца строки ():
if (Serial.available()) {
String message = Serial.readStringUntil('
');
}
Для ускорения операций избегайте избыточного копирования. Вместо String применяйте char[] с функциями strtok() или sscanf():
char buffer[] = "X:10,Y:20";
int x, y;
sscanf(buffer, "X:%d,Y:%d", &x, &y);
Разделение текста по указанному символу
Для разбивки последовательности символов на фрагменты используйте функцию String::indexOf() и String::substring(). Укажите разделитель, затем извлекайте подстроки между его вхождениями.
Практическая реализация
Допустим, имеется последовательность «123,456,789», где запятая – разделитель. Код ниже извлекает три числа:
String data = "123,456,789";
int delimiterPos;
String part;
while ((delimiterPos = data.indexOf(',')) != -1) {
part = data.substring(0, delimiterPos);
Serial.println(part);
data = data.substring(delimiterPos + 1);
}
Serial.println(data); // Последний фрагмент
Оптимизация для частых операций
Если разделение выполняется многократно, создайте массив для хранения результатов. Укажите максимальное количество фрагментов заранее, чтобы избежать переполнения:
String segments[10];
int count = 0;
String remaining = "A;B;C;D";
while (remaining.length() > 0 && count < 10) {
int splitPos = remaining.indexOf(';');
if (splitPos == -1) {
segments[count++] = remaining;
break;
}
segments[count++] = remaining.substring(0, splitPos);
remaining = remaining.substring(splitPos + 1);
}
Для работы с динамической памятью используйте String::reserve(), если ожидается большой объем данных.
Извлечение чисел из текстовой строки в Arduino
Для выделения числовых значений из последовательности символов используйте функцию sscanf() или ручной перебор с проверкой цифр. Пример с sscanf():
char text[] = "Temp: 25.6C, Hum: 70%";
float temperature;
int humidity;
sscanf(text, "Temp: %fC, Hum: %d%%", &temperature, &humidity);
Если формат изменчив, применяйте посимвольный анализ:
- Создайте буфер для временного хранения цифр.
- Проверяйте каждый символ функцией
isdigit()или сравнением с диапазоном'0'..'9'. - Для дробных чисел учитывайте точку или запятую.
- Собранные цифры преобразуйте в число через
atof()илиatoi().
Пример для целых значений:
char input[] = "ID: 456, Count: 12";
int id, count;
char *ptr = input;
while (*ptr) {
if (*ptr >= '0' && *ptr <= '9') {
id = atoi(ptr);
while (*ptr >= '0' && *ptr <= '9') ptr++;
}
ptr++;
}
Для отрицательных чисел добавляйте проверку на минус перед цифрами. Если данные передаются через UART, сохраняйте их в массив перед анализом.
Извлечение данных из текстовых блоков в микроконтроллерах
Разделение значений по разделителям
Для разбивки текста на части используйте strtok(). Укажите символ-разделитель, например, запятую:
char input[] = "12,34,56";
char *token = strtok(input, ",");
while (token != NULL) {
int value = atoi(token);
token = strtok(NULL, ",");
}
Фильтрация цифр из смешанного содержимого
Если нужно оставить только числа, проверяйте каждый символ функцией isdigit():
char text[] = "A1B23C";
for (int i = 0; text[i] != ' '; i++) {
if (isdigit(text[i])) {
Serial.print(text[i]);
}
}











































