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

Wire.available()

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

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

Описание

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

Практически функция нужна в двух ситуациях. На стороне контроллера её вызывают после Wire.requestFrom(): контроллер уже запросил данные у периферийного устройства, и теперь нужно убедиться, что ответ действительно пришёл и буфер не пуст. На стороне периферийного устройства Wire.available() используют внутри обработчика Wire.onReceive(), чтобы последовательно прочитать байты, которые прислал контроллер.

Функция унаследована от класса Stream, но в контексте Wire она почти всегда работает в паре с requestFrom(), read() и onReceive(). Подробнее о библиотеке читайте на странице Wire.

Синтаксис

Wire.available()

Параметры

Нет.

Возвращает

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

Тип данных: int.

Пример кода

Контроллер запрашивает 6 байтов у устройства с адресом 0x08 и считывает всё, что пришло:

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  Wire.requestFrom(0x08, 6);

  while (Wire.available()) {
    char c = Wire.read();
    Serial.print(c);
  }

  delay(500);
}

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

  • После Wire.requestFrom() — убедиться, что периферийное устройство ответило и вернуло ожидаемое количество байтов.
  • Внутри Wire.onReceive() — прочитать данные, которые контроллер отправил периферийному устройству, не выходя за пределы реально пришедших байтов.
  • При отладке I²C-обмена — быстро проверить, поступает ли вообще что-то в буфер, и вывести результат через Serial Monitor.
  • Для защиты от чтения пустого буфера — не вызывать Wire.read() вхолостую, когда данных ещё нет.

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

  • Wire.available() сама по себе ничего не запрашивает и не инициирует передачу. На стороне контроллера перед ней обязательно должен быть вызов Wire.requestFrom().
  • Функция не блокирует выполнение программы: если буфер пуст, она немедленно возвращает 0 и не ждёт данных.
  • Не рассчитывайте, что придёт ровно столько байтов, сколько вы запросили. Периферийное устройство может ответить меньшим количеством. Всегда проверяйте фактическое значение через available().
  • Каждый вызов Wire.read() извлекает один байт из буфера, поэтому возвращаемое значение available() уменьшается на единицу с каждым прочитанным байтом.
  • Если available() стабильно возвращает 0, стоит проверить: правильно ли указан адрес устройства, есть ли подтягивающие резисторы на линиях SDA и SCL, и отвечает ли периферийное устройство на запрос вообще.

Примечания и предупреждения

Для считывания всего содержимого буфера удобно использовать цикл while (Wire.available()): он будет выполняться ровно столько раз, сколько байтов реально пришло. Если же вам нужно прочитать строго определённое количество байтов, дополнительно ведите счётчик итераций — это поможет не принять неполный пакет за корректный ответ.