如何实现Arduino Uno与NodeMCU ESP8266的全双工通信?
Arduino Uno与NodeMCU ESP8266全双工串行通信实现方案
方案1:使用AltSoftSerial库替代SoftwareSerial(推荐)
SoftwareSerial的半双工限制源于它依赖中断且同一时间只能处理接收或发送,而AltSoftSerial是基于定时器的软件串口库,支持全双工通信(同时收发),且对主程序的干扰更小。
接线方式
- Arduino Uno侧:选择支持AltSoftSerial的引脚(Uno上固定为引脚8(RX)、9(TX))
- NodeMCU侧:任选两个空闲GPIO作为串口引脚(例如GPIO14(D5)做RX,GPIO12(D6)做TX)
- 交叉接线:Arduino TX9 → NodeMCU RX(D5);Arduino RX8 → NodeMCU TX(D6);务必将两者的GND引脚连接共地。
代码示例
Arduino Uno 代码
#include <AltSoftSerial.h> AltSoftSerial altSerial; // 创建全双工软件串口实例 void setup() { Serial.begin(9600); // 用于USB调试输出 altSerial.begin(9600); // 初始化与NodeMCU通信的串口 } void loop() { // 周期性发送传感器采集数据 static unsigned long sendTimer = 0; if (millis() - sendTimer >= 1000) { sendTimer = millis(); int sensorValue = analogRead(A0); // 读取模拟传感器数据 altSerial.println(sensorValue); } // 实时监听并接收NodeMCU发来的数据 if (altSerial.available() > 0) { String receivedData = altSerial.readStringUntil('\n'); Serial.print("收到NodeMCU指令: "); Serial.println(receivedData); // 这里添加数据处理逻辑,比如控制外设 } }
NodeMCU ESP8266 代码
#include <SoftwareSerial.h> SoftwareSerial arduinoSerial(D5, D6); // RX=D5, TX=D6 void setup() { Serial.begin(9600); // USB调试串口 arduinoSerial.begin(9600); // 初始化与Arduino通信的串口 // 此处添加WiFi连接、数据库初始化代码(根据你的数据库类型自行实现) } void loop() { // 实时接收Arduino传感器数据并推送至数据库 if (arduinoSerial.available() > 0) { String sensorData = arduinoSerial.readStringUntil('\n'); Serial.print("收到传感器数据: "); Serial.println(sensorData); // 此处添加数据推送至数据库的逻辑 } // 周期性从数据库拉取数据发送给Arduino static unsigned long fetchTimer = 0; if (millis() - fetchTimer >= 2000) { fetchTimer = millis(); String dbData = getDBData(); // 自定义函数,从数据库获取数据 arduinoSerial.println(dbData); } } String getDBData() { // 实现数据库数据拉取逻辑,比如HTTP请求、MQTT订阅等 return "DB_CONTROL_DATA"; }
方案2:硬件串口直接交叉连接(适合无USB调试需求的场景)
Arduino Uno的硬件串口(RX0/TX1)、NodeMCU的UART0(TXD0/RXD0)本身都是全双工的,直接交叉连接即可实现同时收发,但要注意:上传Arduino程序时必须断开RX0/TX1的接线,否则会因串口冲突导致上传失败。
接线方式
- Arduino TX1 → NodeMCU RXD0(GPIO3)
- Arduino RX0 → NodeMCU TXD0(GPIO1)
- 两者GND引脚连接共地
注意事项
- 上传Arduino程序前,拔掉RX0和TX1的接线,上传完成后再重新接回。
- 若需要保留USB调试功能,可在Arduino侧额外创建一个SoftwareSerial用于调试,硬件串口专门用于和NodeMCU通信。
方案3:I2C总线替代串口(备选)
如果串口引脚资源紧张,可改用I2C总线实现双向通信。Arduino Uno和NodeMCU都原生支持I2C,只需连接SDA、SCL引脚并共地即可。I2C本身是半双工,但通过轮询+中断机制可以实现近乎实时的双向数据传输,满足你的需求。
内容的提问来源于stack exchange,提问作者Dillys Annan
相关产品推荐
相关产品推荐

