ESP32-H2 Supermini的Serial类方法在PIO及Arduino IDE中失效求助
解决ESP32-H2 Supermini中Arduino Serial类失效问题
在Platform IO中使用ESP32-H2 Supermini开发时,调用Serial类相关方法出现异常:Serial.println()无输出,Serial.available()等方法完全无法工作,但printf()可正常输出。
已尝试的排查步骤:
- 补充引入
#include <Arduino.h> - 确认波特率设置为115200
- 验证串口设备为
/dev/ttyACM0 - 关闭RTS和DTR
- 在Arduino IDE 2.3.4中测试,问题复现
- 更换非H2型号ESP32,代码可正常运行
理论上ESP32-H2具备USB-UART功能,且printf()正常,怀疑是ESP32-H2相关配置问题,寻求解决方案。
Platform IO配置文件
[env:esp32-devkitm-1] platform = espressif32 framework = arduino board = esp32-h2-devkitm-1 monitor_speed = 115200 monitor_port = /dev/ttyACM0 monitor_rts = 0 monitor_dtr = 0
测试代码
#include <Arduino.h> int incomingByte = 0; void setup() { Serial.begin(115200); printf("Program started\n"); while (!Serial) { ; // wait for serial port to connect. Needed for native USB } printf("Serial initialized.\n"); delay(1000); Serial.println("Hello, ESP32!"); } void loop() { Serial.println("Loop running..."); if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); // say what you got: printf("I received: %d\n", incomingByte); }else { printf("No data received\n"); } delay(1000); }
输出结果
ESP-ROM:esp32h2-20221101 Build:Nov 1 2022 rst:0x15 (USB_UART_HPSYS),boot:0x8 (SPI_FAST_FLASH_BOOT) Saved PC:0x40802974 SPIWP:0xee mode:DIO, clock div:1 load:0x408460e0,len:0x148 load:0x4083cad0,len:0xcdc load:0x4083efd0,len:0x215c entry 0x4083cad0 Program started Serial initialized. No data received No data received No data received No data received No data received No data received No data received No data received ---- Sent utf8 encoded message: "test\n" ---- No data received No data received No data received No data received
解决方案
方法1:使用SerialUSB替代Serial
ESP32-H2的Arduino框架中,Serial默认绑定硬件UART引脚(而非USB CDC),而printf()直接输出到USB CDC端口。将代码中所有Serial替换为SerialUSB即可解决问题:
修改后的核心代码示例:
void setup() { SerialUSB.begin(115200); printf("Program started\n"); while (!SerialUSB) { ; // 等待USB串口连接 } printf("Serial initialized.\n"); delay(1000); SerialUSB.println("Hello, ESP32!"); } void loop() { SerialUSB.println("Loop running..."); if (SerialUSB.available() > 0) { incomingByte = SerialUSB.read(); printf("I received: %d\n", incomingByte); }else { printf("No data received\n"); } delay(1000); }
方法2:修改编译配置,将Serial映射到USB CDC
在Platform IO的platformio.ini中添加编译标志,强制让Serial指向USB CDC:
[env:esp32-devkitm-1] platform = espressif32 framework = arduino board = esp32-h2-devkitm-1 monitor_speed = 115200 monitor_port = /dev/ttyACM0 monitor_rts = 0 monitor_dtr = 0 build_flags = -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1
原理说明:ESP32-H2的Arduino框架默认将Serial关联到硬件UART,USB CDC需要通过SerialUSB访问或修改编译选项切换映射。printf()正常是因为它直接调用ESP-IDF的日志接口,默认输出到USB CDC。
内容的提问来源于stack exchange,提问作者jazzjazzy
相关产品推荐
相关产品推荐

