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

Arduino Mega2560与ESP32硬件串口通信故障排查求助

Arduino Mega2560 与 ESP32 硬件串口通信接收空行问题

我正尝试建立Arduino Mega2560与ESP32之间的硬件串口通信,Arduino端使用UART3,ESP32端使用UART2。已多次检查引脚连接,且通过电平转换器适配了Arduino的TX信号至ESP32。

Arduino 发送端代码

String InvioDatiESP() {
  String da_passare = ("hello!!!"); 
  return(da_passare);
}

void setup() {
   Serial.begin(9600);
   Serial3.begin(115200);
}

void loop() {
   Serial3.println(InvioDatiESP());
   Serial.println(InvioDatiESP());
   delay(1000);  
}

注:该函数生成字符串是实际代码的简化版本,实际场景中需动态拼接字符串。

ESP32 接收端代码

#define RXp2 16
#define TXp2 17

void setup() {
   Serial.begin(115200);
   Serial2.begin(115200, SERIAL_8N1, RXp2, TXp2);
}

void loop() {
   Serial.println(Serial2.readString());
}

已在IDE中正确设置两端串口波特率以验证通信。运行程序时,ESP32的IDE串口每隔1000ms输出空行,仿佛数据已接收但未正确解析。请问该如何解决此问题?


解决方法

1. 确认引脚连接方向

Arduino的Serial3 TX引脚必须连接到ESP32的Serial2 RX(引脚16),确保Tx-Rx的交叉连接关系,避免引脚接反导致数据无法正确接收。

2. 优化ESP32串口读取逻辑

readString()默认超时时间为1秒,若串口数据未完全接收就触发读取,会返回空字符串。可以先检查串口缓存是否有数据,再读取到换行符为止:

void loop() {
  if (Serial2.available() > 0) {
    String received = Serial2.readStringUntil('\n');
    Serial.println(received);
  }
}

也可缩短超时时间,匹配发送间隔:

void setup() {
   Serial.begin(115200);
   Serial2.begin(115200, SERIAL_8N1, RXp2, TXp2);
   Serial2.setTimeout(50); // 调整超时时间,适配1秒的发送周期
}

void loop() {
   if (Serial2.available()) {
     Serial.println(Serial2.readString());
   }
}

3. 验证电平转换器兼容性

Arduino Mega串口为5V电平,ESP32为3.3V,需确保电平转换器双向、支持115200波特率。可短距离临时用杜邦线直连测试(仅排查用),若能正常接收,说明电平转换器存在故障。

4. 显式统一串口参数

虽然两端默认参数一致,但显式指定可避免隐式参数差异:
Arduino端修改串口初始化代码:

Serial3.begin(115200, SERIAL_8N1);

5. 简化代码排查问题

先移除函数封装,直接发送固定字符串,排除动态拼接逻辑的潜在问题:
Arduino端修改loop函数:

void loop() {
   Serial3.println("hello!!!");
   Serial.println("hello!!!");
   delay(1000);  
}

若此代码能正常接收,再逐步恢复动态字符串拼接逻辑。


内容的提问来源于stack exchange,提问作者Cb95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:01:27