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) определяйте отдельные функции для каждого порта, который хотите обрабатывать таким образом.