ESPShell для Arduino :: UART

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

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#>