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

