Главная chevron_right Функции chevron_right Связь chevron_right serialEvent

serialEvent

serialEvent() вызывается автоматически после каждой итерации loop(), когда в буфере последовательного порта есть данные, но поддерживается лишь на некоторых платах Arduino.

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

Описание

serialEvent() — это функция-обработчик, которую Arduino вызывает автоматически в конце loop(), если в буфере последовательного порта есть непрочитанные данные. Внутри неё используйте Serial.read(), чтобы получить эти данные.

Важно: большинство современных плат Arduino не поддерживают serialEvent(). Подробности — в разделе «Примечания и предупреждения» ниже.

Синтаксис

Определите функцию в скетче — среда выполнения Arduino вызовет её сама, когда в порту появятся данные:

void serialEvent() {
  //операторы
}

На платах Mega 2560 Rev3 и Arduino Due доступны дополнительные последовательные порты. Для каждого из них нужна своя функция с соответствующим номером в конце имени:

void serialEvent1() {
  //операторы
}

void serialEvent2() {
  //операторы
}

void serialEvent3() {
  //операторы
}

Параметры

Функция не принимает параметров.

Возвращает

Ничего (void).

Пример кода

Пример использования SerialEvent:

String inputString = "";
bool stringComplete = false;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Type something and press Enter:");
}

void loop() {
  if (stringComplete) {
    Serial.print("You entered: ");
    Serial.println(inputString);
    inputString = "";
    stringComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char) Serial.read();
    if (inChar == '\n') {
      stringComplete = true;
      break;
    } else {
      inputString += inChar;
    }
  }
}

Примечания и предупреждения

serialEvent() не работает на большинстве современных плат Arduino. По состоянию на декабрь 2023 года поддержка подтверждена только для UNO R3, Nano, Mega 2560 Rev3 и Due.

Если ваша плата не входит в этот список, используйте вместо serialEvent() метод Serial.available(). Он позволяет добиться точно такого же поведения: читать данные из порта только тогда, когда они действительно доступны, — именно так serialEvent() и работает под капотом.

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

  • Чтение команд из Serial Monitor во время выполнения основного цикла.
  • Приём данных от другого микроконтроллера или модуля (GPS, Bluetooth) без блокировки loop().
  • Сборка строки из последовательно приходящих байтов перед её обработкой.

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

  • serialEvent() вызывается после каждой итерации loop(), а не в момент прихода байта. Это значит, что если loop() выполняется долго, данные могут накапливаться в буфере, пока функция не будет вызвана.
  • Внутри serialEvent() обязательно используйте Serial.available() перед Serial.read(), чтобы не читать из пустого буфера.
  • Функция не является настоящим прерыванием — она выполняется в основном потоке, поэтому не нужно беспокоиться о защите разделяемых переменных флагами volatile.
  • Если вы переходите на новую плату и serialEvent() перестаёт работать, замените её на проверку Serial.available() прямо в loop() — поведение будет идентичным.
  • На платах с несколькими UART-портами (Mega, Due) определяйте отдельные функции для каждого порта, который хотите обрабатывать таким образом.

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