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

Stream.available()

stream.available() возвращает количество байтов, уже готовых к чтению в буфере потока — без блокировки, чтобы безопасно вызывать read() только когда данные действительно есть.

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

Описание

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

Это один из базовых инструментов при работе с любым потоком данных: прежде чем вызывать read(), полезно убедиться, что читать есть что. Иначе можно получить некорректные данные или просто -1.

Функция принадлежит классу Stream и доступна во всех классах, которые его наследуют, — например Wire и Serial. Подробнее об иерархии классов см. на странице Stream.

Синтаксис

stream.available()

Параметры

Нет.

Возвращает

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

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

  • Чтение из последовательного порта — перед тем как забирать данные из Serial, проверяют available(), чтобы не читать пустой буфер в цикле.
  • Обмен по I²C — после запроса данных от ведомого устройства через Wire убеждаются, что ответ уже пришёл.
  • Парсинг входящих сообщений — накапливают байты в буфере, пока available() возвращает ненулевое значение, и только потом разбирают пакет целиком.
  • Неблокирующий опрос — в loop() проверяют available() вместо ожидания данных, чтобы программа продолжала выполнять другие задачи.

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

  • available() не блокирует выполнение — она мгновенно возвращает текущее состояние буфера. Это делает её удобной для опроса в основном цикле.
  • Возврат 0 означает только то, что в буфере ничего нет прямо сейчас. Данные могут появиться в следующем вызове loop().
  • Не стоит вызывать read() без предварительной проверки available() — при пустом буфере поведение зависит от конкретного класса-наследника и может вернуть -1 или некорректный байт.
  • Размер буфера ограничен (например, у Serial на большинстве плат он составляет 64 байта). Если данные приходят быстрее, чем их читают, буфер переполнится и новые байты будут потеряны.
  • При отладке удобно выводить значение available() в Serial Monitor, чтобы убедиться, что данные вообще поступают в буфер.