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

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().