Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Связь chevron_right SerialEvent: обработка данных из последовательного порта

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() типичная схема выглядит так:

  1. Читаем символ с помощью Serial.read().
  2. Если это не \n — добавляем к строке (String).
  3. Если встретили \n — устанавливаем флаг «строка готова».
  4. В 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 = ""

Как проверить результат

  1. Загрузите скетч на плату.
  2. Откройте монитор последовательного порта (Ctrl+Shift+M).
  3. В поле ввода напечатайте любое слово, например Hello, и нажмите Enter.
  4. В поле вывода должна появиться строка Hello.

Если всё работает правильно — вы видите отправленную строку обратно в мониторе. Это подтверждает, что serialEvent() корректно собирает символы и передаёт строку в loop() после получения символа перевода строки.

Дополнительные материалы

Больше базовых примеров вы найдёте в разделе built-in examples.

Также изучите language reference — подробный справочник по языку программирования Arduino.

Последнее обновление: 29.07.2015, SM