### [ На русском ] ↔ [ English ]

- UART на ESP32
- Инициализация UART: передача и приём данных
- UART-мост: взаимодействие с модемами и GPS

## ⇮UART на ESP32

ESP32 имеет до 3 аппаратных UART в зависимости от модели (обычный ESP32 имеет 3 UART, а ESP32-S2 — два). UART0 используется в качестве основного порта ввода/вывода как для прошивки, так и для ввода/вывода скетча. В среде Arduino он обозначается как Serial0 или Serial. (На платах с поддержкой USB-OTG основным портом ввода/вывода выступает USB.)

При запуске ESPShell ожидает инициализации Serial скетчем. Обычно это делается в setup(), например так:

    void setup() {
      ....
      Serial.begin(115200);
      ....
    }

Как только ESPShell обнаружит, что Serial работает, он начнёт принимать и выполнять команды пользователя.

Основная идея — упростить отладку связи по UART между ESP32 и другим устройством (например, GSM-модемом или GPS-модулем). Команды UART позволяют инициализировать интерфейс UART на произвольных пинах и взаимодействовать с подключённым устройством.

Совместно с командой "suspend" это также может быть использовано для перенастройки UART, используемого скетчем (например, для изменения скорости или смены пинов).

## ⇮Инициализация UART: передача и приём данных

UART настраивается с помощью команды "uart UART_НОМЕР". После её выполнения приглашение ESPShell меняется с "esp32#>" на "esp32-uartX>", где X — номер UART, что означает переход в режим настройки UART. Ввод "?" и нажатие <Enter> покажет список доступных команд:

     esp32#>ua 1
     esp32-uart1>?
     % Введите "? команда", чтобы получить подробности.
     % Список доступных команд:
     %
     % "?"        : Показать список команд
     % "up"       : Инициализировать UART (пины/скорость)
     % "baud"     : Изменить скорость UART
     % "down"     : Остановить UART
     % "read"     : Прочитать данные из UART
     % "tap"      : Подключиться к устройству по UART
     % "write"    : Отправить байты по UART
     % "exit"     : Выход
     esp32-uart1>

Как видно из вывода выше, доступно 6 команд, специфичных для UART, а также 2 общие команды ("?" и "exit"). Знак вопроса выводит список команд, а "exit" (или Ctrl+Z) завершает режим конфигурации UART.

Также можно использовать глобальные команды внутри контекста UART. Например, команда "pin" работает и в "esp32-uart1>".

Команда | Описание
--- | ---
up | up RX_PIN TX_PIN СКОРОСТЬ [БИТЫ [no|even|odd [1|1.5|2]]] Инициализирует UART. Если UART уже активен, команда ничего не делает. Команда требует 3 обязательных параметра (пины RX и TX, скорость) и до 3 необязательных (число бит данных, чётность, стоп-биты). Скорость можно изменить позже командой "baud". Пока команда "up" не выполнится успешно, другие команды UART использовать нельзя. Значения по умолчанию: 8 бит данных, без чётности, 1 стоп-бит. Допустимые значения БИТЫ: 5, 6, 7 или 8. Чётность: "no", "even" или "odd". Стоп-биты: 1, 1.5 или 2. Пример: инициализация UART2 на пинах 18 и 19 со скоростью 115200:
      esp32#>uart 2
      esp32-uart2>up 18 19 115200
Пример: инициализация UART2 на пинах 18 и 19 со скоростью 9600, 8 бит, 1 стоп-бит, чётность "even":
      esp32#>uart 2
      esp32-uart2>up 18 19 9600 8 even 1
down | down Останавливает ранее инициализированный UART. Если UART не был активен, команда не делает ничего. Примечание: ваш скетч может продолжать использовать UART во время выполнения "down". Используйте глобальную команду "suspend", чтобы приостановить скетч и избежать непредсказуемого поведения.
baud | baud СКОРОСТЬ Изменяет скорость UART. При изменении скорости UART0 может прерваться связь с монитором порта. Убедитесь, что вы установили ту же скорость на мониторе.
read | read Читает все доступные на данный момент байты. Печатаемые символы (включая \t, \n, \r) выводятся как есть. Непечатаемые отображаются как "\0xAB", где AB — шестнадцатеричное значение.
write | write ТЕКСТ1 ТЕКСТ2 ... ТЕКСТn Отправляет строку байтов по UART. Допустимы печатаемые символы и спецпоследовательности: "\n", "\r", "\t", "\\" для перевода строки, возврата каретки, табуляции и обратного слэша. Можно отправлять произвольные байты через \AB, где AB — hex-код. Несколько пробелов сокращаются до одного (команды "write Hello World!" и "write Hello World!" эквивалентны). Чтобы отправить несколько пробелов, используйте "\20" (ASCII 32): "write Hello\20\20\20World!" При использовании "write" на UART0 данные отправляются напрямую в монитор порта: Рис. 1: команда "write" на UART0 Пример: обмен данными с модемом SIMCOM SIM7600E на пинах 21 (RX) и 22 (TX):
      esp32#>uart 2
      esp32-uart2>up 21 22 115200
      esp32-uart2>write \ff\ff\CC\r\n    ← Отправка мусора: игнорируется модемом
      5 bytes sent
      esp32-uart2>write ATI\r\n          ← Отправка команды ATI
      5 bytes sent
      esp32-uart2>read                   ← Чтение ответа
      ATI
      Manufacturer: SIMCOM INCORPORATED
      Model: SIMCOM_SIM7600E
      Revision: SIM7600M21-A_V1.1
      IMEI: 861005075537800
      +GCAP: +CGSM

      OK

      137 bytes read
Этот пример показывает, как настроить UART и отправить команду "ATI" устройству на UART2. Первая команда "write" посылает мусор, вторая — правильную команду. "read" получает ответ модема.

## ⇮Прямое взаимодействие с устройством

Если у вас подключён GSM/LTE модем к UART ESP32, возможно, вы захотите отправлять AT-команды. Или у вас есть GPS-модуль и вы хотите наблюдать за его выводом NMEA. Или два ESP32 соединены через UART и оба работают под управлением ESPShell — и вы хотите выполнять удалённые команды.

Всё это возможно с помощью команды "tap", которая создаёт мост между пользовательским терминалом (например, UART0) и другим UART:

Команда | Описание
--- | ---
tap | tap Устанавливает мост между терминалом пользователя и устройством на UART. Всё, что приходит с UART, отображается пользователю, а всё, что вводит пользователь, отправляется на UART. Особенно полезно при отладке модемов с AT-командами. Примечание: монитор порта Arduino не поддерживает выход из режима tap по `Ctrl+C`. Пример: подключение к модему SIM7600E на пинах 18 (RX) и 19 (TX), отправка команды ATI и выход:
      esp32#>uart 1
      esp32-uart1>up 18 19 115200
      esp32-uart1>tap
      Tapping to UART1, CTRL+C to exit
      ATI                               ← Отправлено пользователем
      Manufacturer: SIMCOM INCORPORATED ← Ответ модема
      Model: SIMCOM_SIM7600E
      Revision: SIM7600M21-A_V1.1
      IMEI: 861005075537800
      +GCAP: +CGSM

      OK

      Exit                              ← Нажат Ctrl+C
      esp32#>