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

Stream.read()

stream.read() считывает один байт из входного потока и сдвигает указатель вперёд — в отличие от peek(), который байт не «потребляет». Возвращает int: значение байта или -1, если поток пуст.

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

Описание

read() читает один байт из входного потока и одновременно «потребляет» его — то есть после вызова указатель сдвигается на следующий байт. Именно в этом ключевое отличие от peek(): peek() тоже возвращает следующий байт, но не продвигает указатель, поэтому повторный вызов peek() вернёт тот же самый байт снова.

Функция принадлежит классу Stream и доступна во всех классах, которые его наследуют, — например Wire и Serial. Подробнее о классе Stream — на странице Stream.

Синтаксис

stream.read()

Параметры

Нет.

Возвращает

Следующий байт из потока в виде числа, или -1, если поток пуст и читать нечего. Тип данных: int.

Обратите внимание: возвращаемый тип int, а не byte — это намеренно. Значение -1 используется как сигнал «данных нет», и если бы тип был беззнаковым, отличить «байт со значением 255» от «нет данных» было бы невозможно. Поэтому перед использованием результата всегда проверяйте, что он не равен -1.

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

  • Чтение команд из Serial — посимвольный разбор строки, пришедшей от компьютера или другого устройства.
  • Работа с I²C через Wire — получение байтов из буфера после запроса данных у ведомого устройства.
  • Парсинг ответов от модулей — например, чтение ответа GPS-модуля или Bluetooth-адаптера побайтово.
  • Совместное использование с peek() — сначала смотрим на байт через peek(), чтобы решить, как его обрабатывать, затем забираем его через read().

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

  • Перед вызовом read() полезно проверить available(): если он возвращает 0, вызов read() немедленно вернёт -1 без ожидания.
  • read() не блокирует выполнение программы — если данных нет, функция сразу возвращает -1. Если нужно дождаться байта, используйте цикл с проверкой available().
  • Для чтения нескольких байт подряд удобнее readBytes() или readBytesUntil(), которые тоже входят в класс Stream.
  • При работе с текстом возвращаемое значение можно привести к char, но только убедившись, что оно не равно -1.
  • Если показания кажутся неожиданными, проверьте скорость соединения (begin()) и убедитесь, что отправитель и получатель согласованы по формату данных.