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