SerialPassthrough: прозрачный мост между Serial и Serial1
Показывает, как программно соединить Serial и Serial1, чтобы данные прозрачно проходили между USB-портом и аппаратным UART.
Этот пример демонстрирует, как программно «соединить» Serial и Serial1 в единый прозрачный канал. Всё, что приходит на RX-пин аппаратного UART (Serial1), немедленно пересылается в Serial, и наоборот — данные из USB-порта уходят в Serial1.
Пример рассчитан на платы, у которых есть два независимых UART-интерфейса: один на пинах 0/1, второй — на нативном USB порту. Это, например, Zero, MKR1000, 101 и другие платы аналогичной архитектуры.
Как это работает
На большинстве классических плат (Uno, Nano) пины 0 и 1 физически подключены к тому же USB-чипу, через который работает Serial Monitor. На платах с двумя UART всё иначе:
- Serial — это нативный USB-порт, через который IDE открывает Serial Monitor.
- Serial1 — аппаратный UART на пинах 0 (RX) и 1 (TX), независимый от USB.
Скетч в бесконечном цикле проверяет оба порта и переправляет байты из одного в другой. Такая схема называется serial passthrough (прозрачный мост или «сквозная передача»). Она удобна, когда нужно:
- общаться с внешним устройством (GPS, GSM-модем, Bluetooth) через Serial Monitor без дополнительного конвертера;
- прошивать или настраивать другой микроконтроллер, подключённый к пинам 0/1;
- отлаживать протокол обмена, наблюдая трафик в реальном времени.
Необходимое оборудование
Схема подключения

Плата Arduino без дополнительных компонентов — достаточно подключить её к компьютеру по USB. Если нужен мост к внешнему устройству, подключайте его к пинам 0 (RX) и 1 (TX).
Дополнительных компонентов не требуется. Плату достаточно подключить к компьютеру через USB. Для работы с Serial Monitor откройте его в Arduino IDE — он будет общаться с платой через Serial, а всё, что вы отправляете, окажется на пинах 0/1 через Serial1.
Код
/*
Скетч SerialPassthrough
На некоторых платах, таких как Arduino 101, MKR1000, Zero или Micro, есть один
аппаратный последовательный порт, подключённый к цифровым пинам 0–1, и отдельный USB serial
порт, подключённый к Serial Monitor в IDE. Это означает, что «последовательный
сквозной канал» (serial passthrough), возможный на Arduino UNO (обычно используется для
взаимодействия с устройствами/шилдами, требующими настройки через AT-команды по serial),
по умолчанию работать не будет.
Этот скетч позволяет эмулировать поведение serial passthrough. Любой текст,
введённый в Serial Monitor IDE, будет передан на serial-порт на цифровых пинах 0 и 1,
и наоборот.
На платах 101, MKR1000, Zero и Micro «Serial» означает USB serial-порт,
подключённый к Serial Monitor, а «Serial1» — аппаратный serial-порт на пинах 0 и 1.
Этот скетч эмулирует serial passthrough с использованием этих двух портов на
упомянутых платах, однако вы можете изменить имена портов для соединения любых двух
serial-портов на плате с несколькими портами.
создан 23 мая 2016 г.
автор: Erik Nyquist
*/
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
if (Serial.available()) { // Если что-то поступает в Serial (USB),
Serial1.write(Serial.read()); // читаем и отправляем в Serial1 (пины 0 и 1)
}
if (Serial1.available()) { // Если что-то поступает в Serial1 (пины 0 и 1),
Serial.write(Serial1.read()); // читаем и отправляем в Serial (USB)
}
}
Практические замечания
- Скорость (baud rate) должна совпадать. Убедитесь, что скорость, заданная для Serial и Serial1 в скетче, совпадает со скоростью в Serial Monitor и скоростью внешнего устройства. Несовпадение даёт мусор вместо данных.
- Пины 0 и 1 заняты. Пока используется Serial1, пины 0 и 1 нельзя применять как обычные цифровые входы/выходы — это нарушит передачу данных.
- Буферизация. Arduino не добавляет задержки между приёмом и отправкой, но при очень высоких скоростях и длинных пакетах возможна потеря байт из-за ограниченного размера аппаратного буфера (обычно 64 байта). Если это критично, снизьте скорость или добавьте программную буферизацию.
Типичные ошибки
| Симптом | Вероятная причина |
|---|---|
| В Serial Monitor приходит мусор | Разные baud rate в коде и мониторе |
| Данные не проходят совсем | Перепутаны RX и TX у внешнего устройства |
| Плата зависает при загрузке скетча | Внешнее устройство «держит» линию RX/TX во время прошивки — отключите его |
Скетч компилируется, но Serial1 не определён | Плата не поддерживает два UART (например, Uno R3) |
Как проверить результат
- Загрузите скетч на плату.
- Откройте Serial Monitor (или любой терминал) с той же скоростью, что задана в коде.
- Если к пинам 0/1 ничего не подключено, отправленные символы не вернутся обратно — это нормально.
- Подключите пин 0 (RX) к пину 1 (TX) перемычкой («loopback»): теперь всё, что вы вводите в мониторе, должно возвращаться эхом — это подтверждает, что мост работает в обоих направлениях.
Дополнительные материалы
Больше базовых примеров можно найти в разделе built-in examples.
Подробное описание всех функций языка — в language reference.
Последнее обновление: 26.05.2016, AG