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

Serial.find()

Serial.find() читает входящие байты и ищет среди них заданную строку target, возвращая true при успехе или false по истечении таймаута.

Полная статья

Описание

Serial.find() читает байты из буфера последовательного порта и ищет в них заданную строку. Как только строка найдена — функция возвращает управление. Если строка так и не встретилась до истечения таймаута — функция тоже возвращает управление, но уже с результатом «не найдено».

Важно понимать: всё время поиска программа стоит на месте и ждёт. Это блокирующая функция — она не отдаёт управление loop() до тех пор, пока не найдёт цель или не истечёт таймаут.

Serial.find() наследуется от класса Stream.

Синтаксис

Для поиска строки во входящих последовательных данных используйте одну из двух форм:

  • Serial.find(target)
  • Serial.find(target, length)

Вторая форма позволяет явно указать длину искомой строки — это полезно, если строка содержит нулевые байты или вы работаете с бинарными данными.

Параметры

  • Serial — объект последовательного порта (например, Serial, Serial1, Serial2 и т. д.). Список доступных портов для каждой платы смотрите на странице Serial.
  • target — строка, которую нужно найти в потоке данных. Допустимый тип данных: char.
  • length — длина строки поиска в байтах. Допустимый тип данных: size_t.

Возвращаемое значение

Функция возвращает значение типа bool:

  • true — если искомая строка была найдена в буфере до истечения таймаута;
  • false — если таймаут истёк, а строка так и не появилась.

Если функция вернула false, это не обязательно означает ошибку: возможно, данные просто ещё не пришли, передатчик работает медленно или строка отличается от ожидаемой (например, другой регистр или лишний символ).

Пример кода

Следующий код ожидает появления целевой строки OK:

void setup() {
  Serial.begin(9600);
  while (!Serial); // Ожидание инициализации Serial (необходимо на некоторых платах)

  Serial.println("Type 'OK' to continue:");
}

void loop() {
  if (Serial.available()) {
    // Ищем слово "OK" во входящих данных Serial
    if (Serial.find("OK")) {
      Serial.println("Received OK!");
    } else {
      Serial.println("Didn't find OK, try again.");
    }
  }

  delay(1000);
}

Где применяется

  • Парсинг ответов от модулей — например, ожидание строки OK от GSM- или Wi-Fi-модуля после отправки AT-команды.
  • Синхронизация протоколов — поиск маркера начала пакета в потоке байт.
  • Интерактивные скетчи — ожидание конкретной команды от пользователя через Serial Monitor.
  • Работа с GPS-модулями — поиск нужного NMEA-предложения в потоке данных.

Практические замечания

  • Serial.find() — блокирующая функция. Пока она выполняется, остальной код не работает. Если это критично, рассмотрите ручной разбор буфера с помощью Serial.available() и Serial.read().
  • Таймаут по умолчанию составляет 1000 мс. Изменить его можно через Serial.setTimeout().
  • Поиск чувствителен к регистру: строка "ok" и строка "OK" — разные цели.
  • Если функция вернула false, все байты, прочитанные в процессе поиска, уже извлечены из буфера и недоступны для повторного чтения.
  • При использовании формы с параметром length убедитесь, что переданная длина точно соответствует реальному размеру строки — иначе функция может искать неверную последовательность байт.

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