Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Связь chevron_right Несколько Serial-портов на Arduino Mega

Несколько 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 перепутаны местами
Устройство зависает или сбрасываетсяНесовместимые уровни напряжения

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

  1. Загрузите скетч на Mega.
  2. Откройте монитор порта (Ctrl+Shift+M), выберите правильную скорость.
  3. Если внешнее устройство отправляет данные — вы увидите их в мониторе.
  4. Для теста без внешнего устройства можно временно замкнуть пины TX1 (18) и RX1 (19) напрямую — тогда всё, что вы отправляете через Serial1.write(), сразу вернётся обратно.

Подробнее

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

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

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