Несколько Serial-портов на Arduino Mega
Используем дополнительные аппаратные UART-порты Arduino Mega для одновременной работы с несколькими Serial-устройствами.
Иногда одного последовательного порта катастрофически не хватает. Когда нужно одновременно общаться с несколькими Serial-устройствами и при этом выводить отладочную информацию в основное окно монитора порта — лишние пары RX/TX становятся настоящим спасением.
Arduino Mega выгодно отличается от Uno именно в этом: помимо основного Serial (пины 0/1, он же USB), плата имеет ещё три аппаратных UART — Serial1 (18/19), Serial2 (16/17) и Serial3 (14/15). Никаких программных эмуляций, никаких конфликтов с таймерами.
В этом примере мы задействуем Serial1: всё, что приходит на пины RX1/TX1, тут же пересылается в основной Serial и отображается в мониторе порта Arduino IDE.
Необходимое оборудование
- Устройство с поддержкой Serial-интерфейса — например, радиомодуль XBee, Bluetooth®-модуль, RFID-считыватель или другая плата.
Схема подключения
Прежде чем подключать любое Serial-устройство, обязательно изучите его даташит: убедитесь, что уровни сигналов совместимы с Mega (3.3 В или 5 В), и правильно подайте питание.
Подключите пин TX вашего устройства к пину TX1 Mega, а пин RX — к пину RX1 Mega. Обратите внимание: TX одного устройства всегда идёт к RX другого, и наоборот.
Mega должна быть подключена к компьютеру через USB — это обеспечивает основной канал Serial для вывода данных в монитор порта.

Схема подключения Arduino Mega — вид платы с подписями выводов. Устройство подключается к пинам TX1 (18) и RX1 (19).
Принципиальная схема

Принципиальная схема: Arduino Mega соединяется с устройством с поддержкой Serial (УСТРОЙСТВО С ПОДДЕРЖКОЙ SERIAL) через выводы TX1/RX1 (пины 18/19). Линия TX Mega идёт к RX устройства, и наоборот.
Код
Скетч рассчитан на то, что ваше Serial-устройство подключено к пинам TX1 и RX1 (то есть к Serial1).
/*
Тест нескольких Serial-портов
Принимает данные с основного последовательного порта, отправляет на остальные.
Принимает данные с serial port 1, отправляет на основной serial (Serial 0).
Этот пример работает только с платами, имеющими более одного serial-порта: Arduino Mega, Due, Zero и др.
Схема:
- любое serial-устройство, подключённое к Serial port 1
- Serial Monitor открыт на Serial port 0
создан 30 Dec 2008
изменён 20 May 2012
автор Tom Igoe & Jed Roach
изменён 27 Nov 2015
автором Arturo Guadalupi
Этот пример кода находится в общественном достоянии.
*/
void setup() {
// инициализация обоих serial-портов:
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
// чтение из port 1, отправка в port 0:
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.write(inByte);
}
// чтение из port 0, отправка в port 1:
if (Serial.available()) {
int inByte = Serial.read();
Serial1.write(inByte);
}
}
Как это работает
В setup() инициализируются оба порта — Serial (для общения с компьютером) и Serial1 (для общения с внешним устройством). Скорости можно задавать независимо: например, 9600 для монитора порта и 115200 для быстрого модуля.
В loop() скетч постоянно проверяет, есть ли входящие байты на Serial1. Если есть — читает их и тут же отправляет в Serial. Таким образом, всё, что говорит внешнее устройство, немедленно появляется у вас в мониторе порта.
Практические замечания
- Скорости должны совпадать. Если устройство работает на
9600, а вы инициализировалиSerial1на115200— вместо данных получите мусор. Смотрите даташит или настройки устройства. - Уровни напряжения. Mega работает на 5 В. Многие модули (например, XBee, ESP8266) — на 3.3 В. Прямое подключение может повредить модуль. Используйте делитель напряжения или level shifter на линии TX Mega → RX модуля.
- Перекрёстное подключение. TX одного устройства → RX другого. Это классическая ошибка новичков: подключают TX к TX, а потом удивляются тишине.
- Буферизация. Аппаратный буфер UART на Mega — 64 байта. При высоком потоке данных и медленном
loop()возможна потеря байт. Если данные критичны, обрабатывайте их быстро или используйте прерывания.
Типичные ошибки
| Симптом | Вероятная причина |
|---|---|
| В мониторе порта — пусто | Устройство не отправляет данные или скорости не совпадают |
| В мониторе порта — мусор | Неверная скорость (Serial1.begin(...)) |
| Устройство не отвечает на команды | TX и RX перепутаны местами |
| Устройство зависает или сбрасывается | Несовместимые уровни напряжения |
Как проверить результат
- Загрузите скетч на Mega.
- Откройте монитор порта (Ctrl+Shift+M), выберите правильную скорость.
- Если внешнее устройство отправляет данные — вы увидите их в мониторе.
- Для теста без внешнего устройства можно временно замкнуть пины
TX1(18) иRX1(19) напрямую — тогда всё, что вы отправляете черезSerial1.write(), сразу вернётся обратно.
Подробнее
Больше базовых примеров вы найдёте в разделе built-in examples.
Также рекомендуем заглянуть в language reference — подробный справочник по языку программирования Arduino.
Последнее обновление: 29.07.2015, SM