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

Serial.availableForWrite()

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

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

Описание

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

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

Синтаксис

Функция вызывается на объекте последовательного порта:

Serial.availableForWrite()

Параметры

Serial: объект последовательного порта (Serial, Serial1, Serial2 и т. д.). Полный список доступных портов для каждой платы смотрите на странице Serial.

Возвращает

Целое число — количество байтов, которые можно записать в выходной буфер без блокировки. Если буфер полностью занят, вернётся 0.

Пример кода

Пример ниже показывает, как проверить наличие свободного места перед записью:

void setup() {
  Serial.begin(9600); // Запуск последовательной связи на скорости 9600 baud
  while (!Serial);    // Ожидание готовности последовательного порта 
}

void loop() {
  int bytesAvailable = Serial.availableForWrite(); // Проверяем, сколько байт можно записать

  Serial.print("Bytes available to write: ");
  Serial.println(bytesAvailable);

  if (bytesAvailable > 13) {
    Serial.println("Hello, world!"); // Отправляем сообщение только если в буфере достаточно места
  }

  delay(1000); // Ждём секунду перед следующей проверкой
}

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

  • Потоковая передача данных — когда нужно непрерывно отправлять большой объём данных и при этом не допускать пауз в основном цикле.
  • Управление в реальном времени — если скетч управляет моторами, сервоприводами или другими устройствами и не может позволить себе зависнуть на операции вывода.
  • Многопортовые конфигурации — при работе с несколькими последовательными портами одновременно, когда нужно следить за состоянием каждого буфера.
  • Отладка через Serial Monitor — чтобы убедиться, что данные действительно уходят, а не накапливаются в буфере.

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

  • Если функция вернула 0, не стоит пытаться записать данные — вызов Serial.write() или Serial.print() заблокирует выполнение до освобождения буфера.
  • Типичный размер выходного буфера аппаратного UART — 64 байта, но это зависит от платы и версии ядра Arduino.
  • Если вы используете программный UART (библиотека SoftwareSerial), функция вернёт 0 — она возвращает реальное количество свободных байтов только для аппаратного порта HardwareSerial.
  • Проверка availableForWrite() перед записью — хорошая практика в скетчах, где loop() должен работать без задержек.
  • Значение, которое возвращает функция, может измениться уже к следующей строке кода: буфер продолжает опустошаться аппаратно в фоне, пока скетч выполняется.

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