两个ESP32间串口通信实现求助:Arduino示例无法复用
解决ESP32之间串口通信的关键配置与修改
嘿,我来帮你捋捋ESP32串口通信的关键点——毕竟ESP32的串口机制和普通Arduino Uno这类8位单片机还是有区别的,这也是你直接套用Arduino基础串口示例跑不起来的核心原因。结合你的情况,你需要做这些配置和修改:
选对串口引脚,避免调试冲突
ESP32自带3个硬件串口(UART0、UART1、UART2),其中UART0默认绑定USB调试端口(GPIO1=TX,GPIO3=RX),如果用这个串口来做板间通信,上传代码时会和USB占用的串口冲突,导致上传失败或通信异常。建议优先用UART1或UART2:- UART1默认引脚:GPIO9=RX,GPIO10=TX(注意这两个引脚可能和SPI闪存共用,部分开发板可能被占用)
- UART2默认引脚:GPIO17=RX,GPIO16=TX(这个是比较安全的选择,很少被其他功能占用)
另外,两个ESP32的连接必须交叉:A板的TX接B板的RX,A板的RX接B板的TX,别忘了把两块板的GND连在一起(共地是串口通信的基础,没有共地信号会完全紊乱)。
初始化串口时明确参数匹配
和Arduino的Serial.begin()不同,ESP32的非默认串口(Serial1、Serial2)初始化时,最好明确指定通信参数,确保两块板的配置完全一致。比如波特率、数据位、停止位、奇偶校验都要对应上。举个简单的代码例子:
发送端(ESP32 A):void setup() { Serial2.begin(9600, SERIAL_8N1); // 初始化UART2,波特率9600,8数据位、无校验、1停止位 Serial.begin(115200); // 保留Serial用于电脑调试输出 } void loop() { Serial2.println("Hello from ESP32 A!"); Serial.println("Sent message to ESP32 B"); delay(1000); }接收端(ESP32 B):
void setup() { Serial2.begin(9600, SERIAL_8N1); // 和发送端参数完全一致 Serial.begin(115200); } void loop() { if (Serial2.available() > 0) { String receivedMsg = Serial2.readStringUntil('\n'); Serial.println("Received from ESP32 A: " + receivedMsg); } }自定义引脚映射(如果默认引脚被占用)
如果你的开发板默认串口引脚被其他外设占用了,ESP32支持灵活的串口引脚重映射。初始化时可以直接指定RX和TX引脚:// 把UART2的RX映射到GPIO25,TX映射到GPIO26 Serial2.begin(9600, SERIAL_8N1, 25, 26);记得修改两块板的硬件连接,对应新的引脚交叉连接。
排查波特率与电源问题
- 务必使用标准波特率(比如9600、115200、57600),不要用非标准值,否则容易出现乱码;
- 两块板的波特率必须完全一致,哪怕差1都会导致通信失败;
- 确保两块ESP32的供电稳定,避免因为供电不足导致串口信号波动;
- 再次确认共地是否正确,这是很多新手容易忽略的点。
调试小技巧
如果还是无法通信,可以先单独测试单块ESP32的串口功能:用USB转TTL模块连接ESP32的TX/RX,在电脑串口助手上查看是否能正常收发数据,确认单块板的串口工作正常后,再连接两块板测试。
内容的提问来源于stack exchange,提问作者Roger




