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

Arduino与NodeMCU SoftwareSerial通信:整数传输解析异常求助

问题分析与解决方案

核心问题

你遇到的问题根源是Arduino使用ss.write()发送的是原始字节值,而非十进制数字的ASCII字符串。例如当g=1010(对应四位数字1010)时,ss.write(g)仅发送该int值的低8位字节(十进制242),NodeMCU读取到的是这个字节的数值242,而非你期望的整数1010,导致后续的四位数字解析逻辑完全失效。


解决方案一:发送ASCII字符串(推荐,易调试)

通过发送数字的ASCII字符串形式,让NodeMCU读取完整的数字内容后再转换为整数,逻辑更直观。

修改后的Arduino发送代码

int g = d1*1000 + d2*100 + d3*10 + d4;
ss.println(g); // 发送带换行符的数字字符串,作为接收结束标记
Serial.println(g);

修改后的NodeMCU接收代码

if(ss.available()){
  // 读取到换行符为止,获取完整的数字字符串
  String receivedStr = ss.readStringUntil('\n');
  int f = receivedStr.toInt(); // 转换为整数
  Serial.print("Look what arduino gave me :) ");
  Serial.println(f);

  sen1 = f / 1000 % 10;
  sen2 = (f / 100) % 10;
  sen3 = (f / 10) % 10;
  sen4 = f % 10;
}

解决方案二:发送二进制整数(高效,适合批量传输)

如果追求传输效率,可以直接发送int类型的二进制数据,需要保证两端读取完整的字节数(Arduino和NodeMCU的int均为2字节)。

修改后的Arduino发送代码

int g = d1*1000 + d2*100 + d3*10 + d4;
// 分两次发送int的高字节和低字节
ss.write((uint8_t)(g >> 8));
ss.write((uint8_t)g);
Serial.println(g);

修改后的NodeMCU接收代码

// 确保有完整的2字节数据再读取
if(ss.available() >= 2){
  uint8_t highByte = ss.read();
  uint8_t lowByte = ss.read();
  // 拼接两个字节为完整的int值
  int f = (highByte << 8) | lowByte;
  Serial.print("Look what arduino gave me :) ");
  Serial.println(f);

  sen1 = f / 1000 % 10;
  sen2 = (f / 100) % 10;
  sen3 = (f / 10) % 10;
  sen4 = f % 10;
}

原代码错误细节

原Arduino代码中ss.write(g)仅发送int类型的低8位字节(因为write()默认处理单个字节),例如当g=1010时,低8位为1010 - 3*256 = 242,NodeMCU读取到的是242而非1010,自然无法解析出正确的四位数字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:20:24