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

Serial.flush()

Serial.flush() блокирует выполнение скетча до тех пор, пока все данные из исходящего буфера не будут физически переданы через последовательный порт.

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

Описание

Когда вы вызываете Serial.print() или Serial.write(), данные не уходят в порт мгновенно — они сначала попадают в буфер передачи, а уже оттуда постепенно отправляются. Serial.flush() блокирует выполнение программы до тех пор, пока этот буфер полностью не опустеет, то есть пока все байты не будут физически переданы.

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

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

Синтаксис

Serial.flush()

Параметры

Serial: объект последовательного порта. Список доступных последовательных портов для каждой платы — на странице Serial.

Возвращает

Функция ничего не возвращает.

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

  • Синхронизация с внешним устройством: если после отправки команды нужно убедиться, что устройство получило её целиком, прежде чем переходить к следующему шагу.
  • Корректное завершение передачи перед сбросом или переходом в сон: чтобы не потерять последние байты лога или статуса.
  • Отладка через Serial Monitor: когда важно, чтобы все сообщения появились на экране до того, как плата выполнит критическую операцию (например, перезагрузку или переключение режима).
  • Работа с несколькими последовательными портами: на платах с Serial1, Serial2 и т. д. можно вызвать flush() на конкретном порту, не затрагивая остальные.

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

  • Serial.flush()блокирующая функция. Пока буфер не опустеет, скетч стоит на месте. Не вызывайте её в чувствительных ко времени участках кода без необходимости.
  • При небольших скоростях (например, 9600 бод) задержка может быть заметной, если в буфере накопилось много данных. При 115200 бод она практически незаметна для коротких сообщений.
  • В большинстве скетчей flush() не нужен: данные и так уйдут в порт до следующего вызова print(). Он нужен только тогда, когда важна гарантия завершения передачи в конкретный момент времени.
  • Не путайте с Serial.available() и Serial.read() — те работают с входящим потоком данных.

Пример кода

Следующий код дожидается, пока все данные в буфере будут отправлены, и только после этого включает светодиод:

void setup() {
  Serial.begin(9600);
  
  Serial.print("Sending... "); // это может быть большой объём данных
  Serial.flush();  // ожидает, пока всё вышеперечисленное действительно будет отправлено
  digitalWrite(LED_BUILTIN, HIGH); // светодиод включается только после отправки данных
}

void loop() {
}

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