Stream.parseFloat()
parseFloat() читает из потока Stream первое число с плавающей точкой, пропуская ненужные символы согласно выбранному режиму LookaheadMode.
Полная статья
Описание
parseFloat() просматривает входной поток и возвращает первое найденное число с плавающей точкой. Поиск заканчивается, как только встречается символ, который не может быть частью числа, — или когда истекает таймаут ожидания данных (настраивается через Stream.setTimeout()).
Функция принадлежит классу Stream и доступна во всех классах, которые его наследуют, — в том числе в Wire и Serial. Подробнее о самом классе читайте на странице Stream.
Типичная ситуация применения — разбор текстового потока, в котором числа с плавающей точкой перемежаются другими символами: например, строка вида "temp:23.5;hum:60.1", принятая по Serial или Wire. Вместо того чтобы вручную искать подстроку и вызывать atof(), достаточно последовательно вызывать parseFloat() — и функция сама пропустит лишние символы (в зависимости от выбранного режима) и вернёт очередное число.
Синтаксис
stream.parseFloat()stream.parseFloat(lookahead)stream.parseFloat(lookahead, ignore)
Параметры
lookahead: стратегия поиска числа в потоке. Тип данных:LookaheadMode. Возможные значения:SKIP_ALL— всё, что не является цифрой, знаком минус или десятичной точкой, молча пропускается. Это поведение по умолчанию: функция «проматывает» мусорные символы и находит первое число.SKIP_NONE— ничего не пропускается. Если первый символ в буфере не является началом допустимого числа, функция сразу возвращает0и не трогает поток.SKIP_WHITESPACE— пропускаются только пробельные символы: пробел, табуляция (\t), перевод строки (\n) и возврат каретки (\r). Любой другой нечисловой символ остановит поиск.ignore: символ, который нужно игнорировать внутри числа. Удобно, например, для чисел с разделителем тысяч: если передать',', то строка"1,234.56"будет прочитана как1234.56. Тип данных:char.
Возвращает
Первое допустимое число с плавающей точкой, найденное в потоке, или 0.0, если ничего найти не удалось (например, поток пуст или таймаут истёк раньше, чем пришли данные). Тип данных: float.
Где применяется
- Разбор телеметрии с датчиков, передающих данные в текстовом виде через
Serial("23.5,60.1,1013.25"). - Чтение координат или углов из GPS-модуля или IMU по UART.
- Получение числовых команд от компьютера или другого микроконтроллера через последовательный порт.
- Разбор ответов I²C-устройств, возвращающих данные в ASCII-формате через
Wire.
Практические замечания
parseFloat()блокирует выполнение скетча до тех пор, пока не найдёт число или не истечёт таймаут. Если данные приходят редко, это может заметно «подвешивать» программу. В таких случаях стоит проверятьSerial.available()перед вызовом или уменьшить таймаут черезSerial.setTimeout().- Режим
SKIP_ALLудобен для «грязных» потоков, но может случайно «проглотить» значимые символы. Если структура данных строгая, лучше выбратьSKIP_WHITESPACEилиSKIP_NONE. - При режиме
SKIP_NONEфункция не изменяет состояние потока в случае неудачи — это позволяет самостоятельно обработать нераспознанный символ, прочитав его черезread(). - Если функция вернула
0.0, это не обязательно означает ошибку: возможно, данные ещё не пришли. Убедитесь, что таймаут достаточно велик для вашего источника данных. - Точность результата ограничена типом
float— примерно 6–7 значимых цифр. Для задач, требующих большей точности, рассмотрите ручной разбор строки с последующим преобразованием вdouble.