Главная chevron_right Функции chevron_right Связь chevron_right Stream.parseFloat()

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.