Serial.read()
Serial.read() извлекает и удаляет один байт из входного буфера последовательного порта, возвращая число от 0 до 255 или -1, если буфер пуст.
Полная статья
Описание
Serial.read() извлекает один байт из входного буфера последовательного порта. Важно понимать: байт не просто читается — он потребляется, то есть после вызова функции он исчезает из буфера и повторно прочитать его не получится. Если буфер пуст, функция немедленно вернёт -1, не ожидая новых данных.
Serial.read() наследуется от класса Stream.
Синтаксис
Serial.read()
Параметры
Serial — объект последовательного порта. На платах с несколькими аппаратными UART (например, Mega или Leonardo) можно указать Serial1, Serial2 и т. д. Список доступных портов для каждой платы смотрите на странице Serial.
Возвращает
Первый байт из входного буфера в виде числа от 0 до 255, или -1, если буфер пуст. Тип данных: int.
Почему именно int, а не byte? Потому что значение -1 используется как признак отсутствия данных — оно не помещается в беззнаковый byte, поэтому возвращаемый тип шире.
Пример кода
int incomingByte = 0; // для входящих последовательных данных
void setup() {
Serial.begin(9600); // открывает последовательный порт, устанавливает скорость 9600 bps
}
void loop() {
// отправлять данные только при получении данных:
if (Serial.available() > 0) {
// читаем входящий байт:
incomingByte = Serial.read();
// выводим полученное:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
Где применяется
- Приём команд с компьютера — скетч читает символы из Serial Monitor и реагирует на них: включает светодиод, меняет режим работы и т. п.
- Обмен данными между платами — одна Arduino отправляет показания датчика, другая читает их побайтово через
Serial.read(). - Разбор текстовых протоколов — чтение строк, разделённых символом
\nили другим маркером, с накоплением байт в массив. - Взаимодействие с внешними модулями — GPS, Bluetooth и GSM-модули обычно общаются через UART;
Serial.read()— базовый инструмент для получения их ответов.
Практические замечания
- Проверяйте наличие данных перед чтением. Вызывайте
Serial.read()только после того, какSerial.available()вернул значение больше нуля. Иначе вы получите-1и можете случайно принять его за реальный байт. - Функция не блокирует выполнение. В отличие от
Serial.readString()илиSerial.readBytes(),Serial.read()возвращает управление мгновенно — это удобно вloop(), где нельзя надолго останавливать программу. - Буфер ограничен по размеру (по умолчанию 64 байта на большинстве плат). Если данные поступают быстро, а скетч читает их медленно, часть байт может быть потеряна.
- Обрабатывайте данные побайтово осознанно. Один вызов
Serial.read()даёт ровно один байт. Для чтения числа, строки или структуры нужно вызывать функцию в цикле и собирать байты самостоятельно. - Значение
-1— этоint, а не байт. Если сохранять результат в переменную типаbyteилиchar, признак пустого буфера будет потерян. Всегда используйтеintдля хранения результатаSerial.read().