Serial.parseFloat()
Serial.parseFloat() читает входной буфер последовательного порта и возвращает первое найденное число с плавающей точкой как float.
Полная статья
Описание
Serial.parseFloat() сканирует входящий поток последовательного порта и возвращает первое найденное число с плавающей точкой. Чтение останавливается, как только встречается символ, который не может быть частью такого числа. Если данные в буфере не появляются достаточно быстро, функция завершается по таймауту — его длительность задаётся через Serial.setTimeout().
Функция полезна, когда устройство получает текстовые данные с числами: например, координаты GPS, показания датчиков с дробной частью или команды вида "move 3.75". Вместо того чтобы вручную разбирать строку, можно вызвать Serial.parseFloat() и сразу получить готовое число.
Serial.parseFloat() наследуется от класса Stream.
Синтаксис
Функция доступна в трёх вариантах:
Serial.parseFloat()Serial.parseFloat(lookahead)Serial.parseFloat(lookahead, ignore)
Параметры
Serial — объект последовательного порта. На платах с несколькими UART можно передать Serial1, Serial2 и т. д. Список доступных портов для каждой платы смотрите на странице Serial.
lookahead — режим просмотра буфера, тип LookaheadMode. Управляет тем, как функция обращается с символами, которые не являются частью числа. Допустимые значения:
SKIP_ALL— всё, что не является цифрой, знаком минус или десятичной точкой, просто пропускается. Это поведение по умолчанию: функция «перепрыгивает» через посторонние символы и находит первое число в потоке, где бы оно ни стояло.SKIP_NONE— ничего не пропускается. Если первый символ в буфере не может начинать число, функция немедленно возвращает0.0и не трогает буфер. Удобно, когда нужно точно знать, что следующий токен является числом, прежде чем его читать.SKIP_WHITESPACE— пропускаются только пробельные символы: пробел, табуляция (\t), перевод строки (\n) и возврат каретки (\r). Если после пробелов встречается не-числовой символ, функция останавливается.
ignore — символ, который нужно игнорировать при разборе числа, тип char. Типичный случай — разделитель тысяч: если в потоке приходит строка "1,234.56", передайте ',' в этот параметр, и функция корректно вернёт 1234.56.
Возвращает
Первое найденное число с плавающей точкой, тип float. Если число в буфере не найдено до истечения таймаута, функция возвращает 0.0.
Пример кода
Следующий код извлекает первое допустимое число с плавающей точкой, полученное в последовательном сообщении:
void setup() {
Serial.begin(9600);
while (!Serial)
;
Serial.println("Enter a floating-point number:"); // попробуйте со смешанной фразой, например "The size of the box is 3.5 mm"
}
void loop() {
if (Serial.available()) {
float number = Serial.parseFloat();
if (number != 0) {
Serial.print("You entered: ");
Serial.println(number);
}
}
}
Где применяется
- Чтение координат — разбор строк с широтой и долготой, где числа разделены запятыми или пробелами.
- Управление через Serial Monitor — пользователь вводит значение (например, угол поворота сервопривода), скетч считывает его через
parseFloat(). - Обмен с другим микроконтроллером — когда один Arduino отправляет текстовые пакеты с дробными значениями, второй разбирает их без лишнего кода.
- Чтение данных датчиков — если модуль (GPS, весы, анализатор газа) передаёт показания в виде ASCII-строк.
Практические замечания
- Блокирующее поведение. Функция ждёт данных в буфере. Если поток пуст, она будет ждать до истечения таймаута. По умолчанию таймаут равен 1000 мс; при необходимости измените его через Serial.setTimeout().
- Точность
float. Типfloatна большинстве плат Arduino занимает 4 байта и даёт около 6–7 значащих цифр. Для высокоточных вычислений этого может не хватить. - Результат
0.0не всегда означает ноль. Если функция ничего не нашла (таймаут или неподходящий символ приSKIP_NONE), она тоже вернёт0.0. Проверяйте наличие данных черезSerial.available()перед вызовом, если это важно. - Режим
SKIP_NONEдля строгого разбора. Если протокол подразумевает строго определённый формат, используйтеSKIP_NONE: так вы сразу заметите, что пришли неожиданные данные, и не получите ложный ноль. - Параметр
ignoreдля форматированных чисел. Если источник данных форматирует числа с разделителями тысяч (например,"12,345.67"), передайте','какignore, иначе функция остановится на запятой и вернёт только12.0.