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

Serial.available()

Serial.available() возвращает количество байтов, накопившихся во входном буфере последовательного порта и готовых к чтению через Serial.read().

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

Описание

Serial.available() возвращает количество байтов, которые уже получены и находятся во входном буфере последовательного порта. Буфер вмещает до 64 байт — это данные, которые поступили по UART, но ещё не были прочитаны скетчем.

Функция не читает данные и не удаляет их из буфера — она только сообщает, сколько байтов там накопилось. Реально читать байты нужно с помощью Serial.read() или похожих функций.

Serial.available() наследуется от класса Stream.

Синтаксис

Serial.available()

Параметры

Serial — объект последовательного порта. На платах с несколькими аппаратными UART-портами (например, Mega) вместо Serial можно использовать Serial1, Serial2 и т. д. Список доступных портов для каждой платы приведён на странице Serial.

Возвращает

Целое число — количество байтов, доступных для чтения прямо сейчас. Возвращает 0, если буфер пуст.

Примеры

Следующий код читает и отправляет обратно каждый байт, как только он появляется в буфере:

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);
  }
}

Передача данных между двумя последовательными портами. Этот пример пересылает всё, что приходит на один порт платы Arduino, в другой. Такой приём удобен, когда нужно соединить внешнее последовательное устройство с компьютером через плату Arduino:

void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  // читаем из порта 0, отправляем в порт 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.print(inByte, DEC);
  }
  // читаем из порта 1, отправляем в порт 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.print(inByte, DEC);
  }
}

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

  • Приём команд из Serial Monitor — скетч проверяет Serial.available() в loop() и обрабатывает строку только когда все символы уже пришли.
  • Работа с GPS, Bluetooth, GSM-модулями — данные поступают асинхронно, и Serial.available() позволяет не блокировать выполнение программы в ожидании байта.
  • Мост между двумя устройствами — как показано во втором примере, удобно перебрасывать данные из одного порта в другой.
  • Парсинг протоколов с фиксированной длиной пакета — можно дождаться, пока Serial.available() вернёт нужное количество байтов, и только потом читать весь пакет целиком.

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

  • Serial.available() не блокирует выполнение скетча — если буфер пуст, она мгновенно возвращает 0. Это делает её удобной для проверки в loop() без задержек.
  • Буфер ограничен 64 байтами. Если данные поступают быстро, а скетч читает их медленно, буфер переполнится и новые байты будут потеряны без каких-либо предупреждений. Читайте данные своевременно.
  • Типичная идиома — while (Serial.available() > 0) { char c = Serial.read(); ... } — позволяет вычитать всё накопленное за один проход loop().
  • Если вы ожидаете строку, завершённую символом перевода строки, удобнее использовать Serial.readStringUntil('\n'), но помните, что она блокирует выполнение до таймаута.
  • При отладке можно вывести значение Serial.available() в Serial Monitor, чтобы убедиться, что данные вообще приходят и не теряются.

Полезные материалы