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

