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, чтобы убедиться, что данные вообще приходят и не теряются.