SerialEvent: обработка данных из последовательного порта
Разбираем функцию serialEvent() — как она автоматически вызывается при наличии данных в буфере Serial и помогает собирать строки посимвольно.
Этот урок показывает, как работает функция serialEvent(). Она автоматически вызывается в конце каждой итерации loop(), если в буфере Serial есть непрочитанные данные. В примере каждый поступающий символ добавляется к строке до тех пор, пока не встретится символ перевода строки (\n). После этого накопленная строка выводится в монитор порта и сбрасывается.
Необходимое оборудование
Схема подключения

Внешних компонентов не нужно — достаточно подключить плату Arduino к компьютеру по USB. Для отправки символов и просмотра ответа используйте встроенный монитор последовательного порта в Arduino IDE.
Подпись к схеме: плата Arduino UNO подключена к компьютеру через USB. Пины DIGITAL, ANALOG IN, POWER и остальные разъёмы остаются свободными — дополнительная обвязка не требуется.
Как это работает
Функция serialEvent() — это не обработчик прерывания в классическом смысле. Она вызывается автоматически средой выполнения Arduino сразу после завершения каждого прохода loop(), но только если в буфере Serial есть хотя бы один байт. Это удобно: основной код в loop() не засоряется проверками Serial.available(), а логика разбора данных вынесена в отдельную функцию.
Внутри serialEvent() типичная схема выглядит так:
- Читаем символ с помощью
Serial.read(). - Если это не
\n— добавляем к строке (String). - Если встретили
\n— устанавливаем флаг «строка готова». - В
loop()проверяем флаг и обрабатываем строку.
Код
Практические замечания
serialEvent()не является настоящим прерыванием — она не прервёт выполнениеloop()в середине. Еслиloop()работает долго (например, внутри естьdelay()), данные будут обработаны позже, хотя и не потеряются — они хранятся в аппаратном буфере.- Для Arduino Leonardo и некоторых других плат на базе ATmega32U4 функция
serialEvent()не поддерживается. На таких платах проверяйтеSerial.available()вручную прямо вloop(). - Если вы используете несколько последовательных портов (например, на Arduino Mega), для каждого порта существует своя версия:
serialEvent1(),serialEvent2(),serialEvent3(). - В мониторе порта убедитесь, что в выпадающем меню выбрано «Новая строка» (Newline) — иначе символ
\nне будет отправлен и строка никогда не завершится.
Типичные ошибки
| Проблема | Причина | Решение |
|---|---|---|
| Строка не выводится | В мониторе не выбран режим «Newline» | Установить «Newline» в настройках монитора |
| На Leonardo функция не вызывается | serialEvent() не поддерживается на ATmega32U4 | Использовать Serial.available() в loop() |
| Строка выводится пустой | inputString не сбрасывается после вывода | Убедитесь, что после печати выполняется inputString = "" |
Как проверить результат
- Загрузите скетч на плату.
- Откройте монитор последовательного порта (Ctrl+Shift+M).
- В поле ввода напечатайте любое слово, например
Hello, и нажмите Enter. - В поле вывода должна появиться строка
Hello.
Если всё работает правильно — вы видите отправленную строку обратно в мониторе. Это подтверждает, что serialEvent() корректно собирает символы и передаёт строку в loop() после получения символа перевода строки.
Дополнительные материалы
Больше базовых примеров вы найдёте в разделе built-in examples.
Также изучите language reference — подробный справочник по языку программирования Arduino.
Последнее обновление: 29.07.2015, SM