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
相关产品推荐
相关产品推荐

