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

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.

Полезные материалы