if(Serial)
Проверяет, открыто ли соединение с последовательным портом — на платах с нативным USB (Leonardo, Micro, Zero) возвращает true только после того, как компьютер реально открыл порт.
Полная статья
Описание
if(Serial) позволяет узнать, установлено ли соединение с последовательным портом и готов ли он принимать данные. Это особенно важно для плат с нативным USB-интерфейсом (например, Arduino Leonardo, Micro, Zero): там Serial реализован через USB CDC, и порт считается открытым только тогда, когда компьютер действительно подключился и открыл соединение. До этого момента любые вызовы Serial.print() просто уйдут в никуда.
На платах с аппаратным UART (например, Arduino Uno или Mega) Serial всегда готов сразу после Serial.begin(), поэтому проверка всегда возвращает true — она не несёт практического смысла, но и не ломает код.
На платах Due вместо if(Serial) используется if(SerialUSB).
Синтаксис
Используйте следующую конструкцию, чтобы проверить, открыто ли последовательное соединение:
if (Serial)
Параметры
Serial — объект последовательного порта. Это может быть Serial, Serial1, Serial2 и т. д. в зависимости от платы. Полный список доступных портов для каждой платы смотрите на странице Serial.
Возвращает
true — если порт готов к работе (для UART-портов это всегда так; для USB CDC — только когда соединение реально открыто на стороне компьютера). false — только в случае USB CDC до того, как хост открыл порт. Тип возвращаемого значения: bool.
Пример кода
void setup() {
//Инициализация последовательного порта и ожидание его открытия:
Serial.begin(9600);
while (!Serial) {
; // ожидание подключения последовательного порта. Необходимо для native USB
}
}
void loop() {
//продолжить нормальную работу
}
Где применяется
- Ожидание монитора порта при старте — скетч не начинает работу, пока вы не откроете Serial Monitor, что удобно для отладки: вы не пропустите первые сообщения.
- Платы с нативным USB (Leonardo, Micro, Zero и подобные) — без этой проверки данные, отправленные до подключения компьютера, будут потеряны.
- Условная отправка данных — если устройство работает и без подключённого компьютера, можно пропускать вывод в
Serial, когда соединение не установлено, и не блокировать выполнение программы.
Практические замечания
- Каждый вызов
if(Serial)добавляет задержку около 10 мс — это намеренное поведение, призванное корректно обработать переходное состояние «порт открывается». Не вызывайте эту проверку в узком цикле: это существенно замедлит программу. - На платах с обычным UART (Uno, Mega, Nano) проверка всегда возвращает
true— её можно не использовать, но и вреда она не принесёт. - Типичный паттерн для плат с нативным USB — цикл
while (!Serial);вsetup(). Он удобен при отладке, но помните: если компьютер не подключён, плата зависнет на этом месте и не начнёт выполнять основной код. - Если вам нужно, чтобы устройство работало и без компьютера, замените
while (!Serial);наwhile (!Serial && millis() < 3000);— это даст таймаут в 3 секунды. falseвозвращается только для USB CDC-портов; для аппаратных UART такого не бывает.
Примечания и предупреждения
Функция намеренно добавляет задержку 10 мс при каждом вызове. Не используйте её в быстрых циклах — это ухудшит производительность скетча.