Wire.read()
Wire.read() извлекает один байт из входного буфера I²C — после requestFrom() на контроллере или внутри обработчика onReceive() на периферии. Возвращает int, при пустом буфере — -1.
Полная статья
Описание
read() извлекает один байт из входного буфера I²C. Функция работает в двух ситуациях:
- Контроллер читает данные от периферийного устройства — после того как вы запросили нужное количество байт через
requestFrom(), вызывайтеWire.read()столько раз, сколько байт ожидаете получить. - Периферийное устройство читает данные от контроллера — внутри обработчика
onReceive(), когда контроллер отправил данные, а периферия должна их принять.
Функция наследует поведение класса Stream, а в библиотеке Wire используется для чтения байтов, уже находящихся во входном буфере. Подробнее о библиотеке см. на странице Wire.
Синтаксис
Wire.read()
Параметры
Нет.
Возвращает
Очередной байт из буфера приёма, или -1, если буфер пуст. Тип данных: int.
Обратите внимание: возвращаемый тип — int, а не byte. Значение -1 (то есть Wire.read() вернул Wire.read() == -1) означает, что данных в буфере нет. Это важно учитывать при проверке результата.
Пример кода
#include <Wire.h>
void setup() {
Wire.begin(); // Подключиться к шине I2C (адрес не обязателен для устройства-контроллера)
Serial.begin(9600); // Инициализировать Serial для вывода данных
}
void loop() {
Wire.requestFrom(2, 6); // Запросить 6 байт от периферийного устройства №2
// Периферийное устройство может отправить меньше, чем запрошено
while (Wire.available()) {
char c = Wire.read(); // Принять байт как символ
Serial.print(c); // Вывести символ
}
delay(500);
}
Где применяется
- Чтение показаний датчика (температура, давление, акселерометр) по I²C: сначала
requestFrom(), затем несколько вызововWire.read()для каждого байта ответа. - Приём многобайтовых команд от контроллера на периферийном устройстве внутри обработчика
onReceive(). - Разбор регистров I²C-микросхем, где старший и младший байты приходят последовательно и требуют сборки в одно значение.
Практические замечания
- Перед вызовом
Wire.read()убедитесь, что в буфере есть данные. ИспользуйтеWire.available(), чтобы узнать количество непрочитанных байт. - Каждый вызов
Wire.read()извлекает ровно один байт и сдвигает указатель буфера вперёд. Повторный вызов вернёт следующий байт, а не тот же самый. - Если функция вернула
-1, а вы ожидали данные, проверьте адрес устройства и убедитесь, чтоrequestFrom()был вызван с правильным числом байт. - При сборке многобайтового числа (например, 16-битного значения из двух байт) важен порядок: уточните в документации датчика, какой байт приходит первым — старший (big-endian) или младший (little-endian).
- Внутри обработчика
onReceive()вызывайтеWire.read()в цикле, покаWire.available()возвращает ненулевое значение, чтобы не потерять данные.