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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:23:11