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

Arduino Uno与ESP8266串口通信返回-1问题如何修复

Arduino Uno与ESP8266 NodeMCU串口通信返回-1问题修复

Serial.read()返回-1是串口接收缓冲区无可用数据时的固定返回值,你的代码存在多处逻辑错误,同时需要确认接线是否符合规范,具体排查方案如下:

现存问题

  • 串口对象调用错误:ESP8266端定义了myNode软串口用于和Uno通信,但代码中调用Serial.read()读取的是连接电脑监视器的硬件串口,该串口未连接Uno,自然读不到有效数据。
  • 数据发送方式错误:Uno端使用mySerial.write(i)发送float类型变量不符合方法逻辑,write()仅能发送单字节数据,而float类型占4字节内存,直接调用只会发送变量的第一个字节,无法传输完整数值。
  • 缺少数据接收判断:ESP8266端未判断串口是否有可读数据就直接执行读取操作,大概率读到空值返回-1;且loop中设置1000ms延迟会错过串口数据接收窗口,导致漏读。
  • 接线常见疏漏:两块开发板串口通信必须交叉接线(发送端接对方接收端),且必须共地,否则电平参考不一致会导致通信完全失败;注意ESP8266是3.3V器件,不要直接接入Uno的5V IO信号,避免烧毁引脚。

修复后代码

Arduino Uno端代码

#include <SoftwareSerial.h>

// 软串口定义:RX引脚10, TX引脚11
SoftwareSerial mySerial(10, 11); 

float send_val = 10;
void setup() {
  Serial.begin(9600);   // 硬件串口,连接电脑串口监视器
  mySerial.begin(9600); // 软串口,连接ESP8266
}

void loop() {
  Serial.print("本地发送数值:");
  Serial.println(send_val);
  // 用println将数值转为字符串发送,避免二进制传输的字节序、长度问题
  mySerial.println(send_val);
  delay(1000);
}

ESP8266 NodeMCU端代码

#include <SoftwareSerial.h>

// 软串口定义:RX引脚D1, TX引脚D2
SoftwareSerial myNode(D1, D2); 

float recv_val;
void setup() {
  Serial.begin(115200); // 硬件串口,连接电脑串口监视器
  myNode.begin(9600);   // 软串口,连接Arduino Uno,波特率需和Uno端一致
}

void loop() {
  // 先判断软串口是否有可读数据,有数据时再执行读取
  if (myNode.available() > 0) {
    recv_val = myNode.parseFloat();
    // 清空缓冲区残留的换行、回车字符
    while(myNode.available()) myNode.read();
    Serial.print("The Number is ");
    Serial.println(recv_val);
  }
  delay(10); // 缩短延迟避免漏读串口数据
}

接线核对清单

  • Arduino Uno D11(软串口TX) → ESP8266 D1(软串口RX)
  • Arduino Uno D10(软串口RX) → ESP8266 D2(软串口TX)
  • Arduino Uno GND → ESP8266 GND(必须连接,无共地无法通信)
  • 供电建议:两块板优先使用独立USB供电,若共用电源需确保ESP8266侧IO输入电平不超过3.3V

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:24:25