Arduino 433MHz模块传输FSR长整型数据问题求助
解决433MHz模块传输FSR长整型力值的问题
你遇到的核心问题是长整型(long)数据无法直接以字符数组形式传输,RH_ASK库的send函数需要的是字节流(uint8_t类型),字符串本质是ASCII字节数组,而long是二进制数值,直接转指针会导致传输的是二进制原始值而非可读字符,接收端自然无法正确解析。
下面提供两种可行的解决方案:
方案1:将长整型转换为字符串传输(直观易调试)
这种方式和你之前传输"Hello World!"的逻辑完全一致,把力值转成ASCII字符串后发送,接收端直接按字符串解析即可。
修改发射端代码
找到原来发送"Hello World!"的代码段,替换为以下内容:
// 将long类型的fsrForce转换为十进制字符串 char forceStr[20]; // 足够容纳32位long的最大字符数(含负号) itoa(fsrForce, forceStr, 10); // 10表示按十进制转换 // 发送转换后的字符串 driver.send((uint8_t *)forceStr, strlen(forceStr)); driver.waitPacketSent(); delay(1000);
也可以用Arduino的String类简化:
String forceStr = String(fsrForce);,再通过forceStr.c_str()获取字符指针,不过itoa函数更节省内存。
修改接收端代码
原来的缓冲区buf[12]容量不足,无法容纳长整型转成的字符串,需要扩容:
void loop() { uint8_t buf[20]; // 扩容到足够容纳力值字符串 uint8_t buflen = sizeof(buf); if (driver.recv(buf, &buflen)) // Non-blocking { buf[buflen] = '\0'; // 手动添加字符串结束符,避免乱码 Serial.print("Received Force: "); Serial.println((char*)buf); } }
方案2:直接传输长整型的二进制字节(高效省带宽)
如果不需要可读的字符串,直接传输long的二进制原始字节更高效,传输数据量仅为4字节(32位long的标准大小)。
修改发射端代码
替换发送部分为:
// 直接发送long类型的二进制数据,长度为long的字节数 driver.send((uint8_t *)&fsrForce, sizeof(long)); driver.waitPacketSent(); delay(1000);
修改接收端代码
接收后将字节数组重新组装为long类型:
void loop() { uint8_t buf[sizeof(long)]; uint8_t buflen = sizeof(buf); if (driver.recv(buf, &buflen)) // Non-blocking { // 将字节数组转换为long类型 long receivedForce = *(long*)buf; Serial.print("Received Force (Newtons): "); Serial.println(receivedForce); } }
注意事项
- 确保发射端和接收端的long类型字节序一致(Arduino平台默认都是小端序,无需额外处理)
- 方案1适合需要直观查看数据的调试场景,方案2适合对传输效率要求高的正式场景
- 测试时可以先在发射端打印转换后的字符串或二进制值,确认数据正确后再进行传输
内容的提问来源于stack exchange,提问作者Hannah Zaderaka
相关产品推荐
相关产品推荐

