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

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 мс при каждом вызове. Не используйте её в быстрых циклах — это ухудшит производительность скетча.