You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:34:53