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

Arduino Uno与NodeMCU串口通信电压传输数值不一致问题求助

问题排查与修复方案

嘿,我一眼就瞅到你代码里的关键问题了,这就是为啥两边电压值对不上的原因!咱们拆解来看:

核心问题:串口数据传输的类型错误

你在Arduino里用s.write(voltage)发送float类型的电压值,但SoftwareSerial.write()本质是发送单个字节(0-255的整数)。当你把一个float(比如5.0)塞进去时,它只会截取这个浮点数的第一个字节,直接丢失了所有精度和真实数值,NodeMCU那边读到的自然是乱码一样的错误值。

而且NodeMCU这边用s.read()读的也是单个字节,这根本没法还原原来的浮点数,完全是南辕北辙。另外,Arduino的发送逻辑也没必要加s.available()>0的判断,就算触发了,传输方式还是错的。


修正后的完整代码

Arduino 端代码

咱们改成把电压值转换成字符串发送,串口传文本就不会有精度丢失,NodeMCU那边也能准确还原:

#include <SoftwareSerial.h>
SoftwareSerial s(5,6); // RX引脚5,TX引脚6

void setup() {
  s.begin(9600);
  Serial.begin(9600);
}

void loop() {
  // 读取A0的ADC值
  int ADCdata = analogRead(A0);
  // 计算电压:5V参考电压 / 1024分辨率 = 0.0048828125
  float voltage = ADCdata * 0.0048828125;
  
  // 打印到Arduino串口监视器,方便本地调试
  Serial.print("本地ADC值: ");
  Serial.print(ADCdata);
  Serial.print(" | 本地电压: ");
  Serial.println(voltage);
  
  // 把电压转成字符串发送,用println自动加换行符,方便NodeMCU识别结束
  s.println(voltage);
  
  delay(1000);
}

NodeMCU 端代码

这边改成读取整行字符串,再转成float类型:

#include <SoftwareSerial.h>
SoftwareSerial s(D6,D5); // RX引脚D6,TX引脚D5

void setup() {
  s.begin(9600);
  Serial.begin(9600);
}

void loop() {
  if (s.available() > 0) {
    // 读取到换行符为止的整行数据
    String voltageStr = s.readStringUntil('\n');
    // 把字符串转成float类型
    float receivedVoltage = voltageStr.toFloat();
    Serial.print("收到的电压值: ");
    Serial.println(receivedVoltage);
  }
  delay(1000);
}

额外注意事项

  • 确认引脚交叉连接正确:Arduino的TX(引脚6)接NodeMCU的RX(D6),Arduino的RX(引脚5)接NodeMCU的TX(D5),你原来的引脚定义是对的,别搞反哦。
  • 两个设备的GND必须牢牢连在一起,你已经做了这一步,很棒。
  • 如果还是有微小误差,可以检查Arduino的5V参考电压是否准确,部分Uno的5V输出可能略有偏差,你可以用analogReference()函数校准,或者外接高精度参考源。

内容的提问来源于stack exchange,提问作者Yash zala

火山引擎 最新活动