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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:29