Перейти к содержанию

Почему Serial.print ничего не выводит на ESP32-C3?

Обновлено Редакция GAW

У ESP32-C3 два пути, по которым скетч может «печатать»: обычный UART0 и встроенный контроллер USB Serial/JTAG. Какой из них называется Serial, решает пункт меню Arduino IDE «USB CDC On Boot».

USB CDC On BootЧто такое SerialКуда уходит текст
Disabled — по умолчанию у ESP32C3 Dev ModuleSerial0, UART0вывод GPIO21 (TX), приём — GPIO20
EnabledHWCDCSerial, USB Serial/JTAGразъём USB, подключённый к GPIO18 (D−) и GPIO19 (D+)

Так устроено в исходниках arduino-esp32 3.3.12: если макрос ARDUINO_USB_CDC_ON_BOOT равен нулю, Serial объявлен как Serial0, а для ESP32-C3 при включённом пункте — как HWCDCSerial. Номера выводов — по даташиту ESP32-C3.

Какая у вас плата

  • USB через мост USB–UART — как у ESP32-C3-DevKitM-1: мост подключён к UART0, поэтому настройка по умолчанию правильная, и вывод идёт в его COM-порт.
  • USB прямо к выводам чипа — так сделаны многие компактные платы: моста нет, UART0 ни к чему не подключён, и по умолчанию текст уходит на свободные контакты GPIO20/21. Нужно включить USB CDC On Boot.

Если вывода всё равно нет

  1. Проверьте, что в мониторе выбран тот порт, который появляется при подключении платы.
  2. Не используйте GPIO18 и GPIO19 в скетче — переназначение этих выводов отключает USB. Осторожно с Serial1.begin(115200) без номеров выводов: в arduino-esp32 3.3.12 у ESP32-C3 по умолчанию RX1 — GPIO18, TX1 — GPIO19, то есть как раз выводы USB; задавайте выводы явно.
  3. Если скетч уходит в глубокий сон, порт пропадает — это отдельная ситуация, разобранная в ответе о пропавшем порте ESP32-C3.

Как установить поддержку ESP32 в Arduino IDE — в ответе «Как подключить ESP32 к Arduino IDE», распиновка чипа — на странице ESP32-C3.

Похожие вопросы

Как писать и в USB, и в UART одновременно?

Обращайтесь к портам по именам: в arduino-esp32 UART0 всегда доступен как Serial0, а при включённом USB CDC On Boot Serial — это HWCDCSerial. Например, Serial0.begin(115200) и Serial.begin() — и выводите в оба порта отдельно.

Нужно ли указывать скорость в Serial.begin при USB?

Нет. В исходниках arduino-esp32 прямо сказано, что у USB Serial/JTAG нет настраиваемой скорости: данные идут пакетами USB, и число в begin ни на что не влияет. Скорость в мониторе порта тоже можно выбрать любую.

Почему первые строки после сброса теряются?

Компьютеру нужно время, чтобы снова увидеть USB-устройство после перезапуска чипа. В HWCDC оператор bool сообщает, подключён ли хост, поэтому в setup() ставят ожидание while (!Serial) с ограничением по времени — без ограничения плата без компьютера зависнет на этой строке.

Источники

  1. Espressif. arduino-esp32 3.3.12: cores/esp32/HardwareSerial.h, HWCDC.h, HWCDC.cpp, boards.txt, platform.txt (GitHub, LGPL-2.1) — HardwareSerial.h: без ARDUINO_USB_CDC_ON_BOOT Serial = Serial0 (UART0), с ним и ARDUINO_USB_MODE = 1 Serial = HWCDCSerial; platform.txt: для esp32c3 ARDUINO_USB_MODE=1; boards.txt: esp32c3 (ESP32C3 Dev Module) — build.cdc_on_boot=0, меню USB CDC On Boot: Disabled/Enabled; HWCDC.cpp: operator bool возвращает isCDC_Connected(), у USB Serial/JTAG нет настраиваемой скорости; HardwareSerial.h: у ESP32-C3 RX1 по умолчанию GPIO18, TX1 — GPIO19
  2. Espressif. ESP32-C3 Series Datasheet v2.4 — IO MUX: вывод 27 — GPIO20/U0RXD, вывод 28 — GPIO21/U0TXD, «GPIO20, GPIO21: UART0 interface»; USB_D− на GPIO18, USB_D+ на GPIO19

Нашли ошибку?