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()должен работать без задержек. - Значение, которое возвращает функция, может измениться уже к следующей строке кода: буфер продолжает опустошаться аппаратно в фоне, пока скетч выполняется.