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, чтобы убедиться, что данные вообще поступают в буфер.