You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

两个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

火山引擎 最新活动