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

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() возвращает ненулевое значение, чтобы не потерять данные.