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_НОМЕР". После её выполнения приглашение 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 данные отправляются напрямую в монитор порта:
Пример: обмен данными с модемом 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#> |