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()) и убедитесь, что отправитель и получатель согласованы по формату данных.