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

单片机C语言中float转uint8传输及还原方法咨询

Float转uint8数组蓝牙传输及还原方案

核心思路

利用C语言的内存直接操作,将float类型的二进制数据拆分为uint8_t字节数组发送,接收端再将字节数组重新拼接还原为float。无需自定义结构体,完全符合传输限制。


发送端(单片机C语言实现)

多数单片机的float为4字节IEEE754单精度格式,直接通过内存拷贝或指针转换拆分字节:

#include <string.h>
#include <stdint.h>

// 示例:待发送的浮点读数
float sensor_reading = 36.8f;
uint8_t tx_bytes[sizeof(float)]; // 存储拆分后的字节,长度等于float的字节数

// 方法1:用memcpy直接拷贝内存
memcpy(tx_bytes, &sensor_reading, sizeof(float));

// 方法2:指针强制转换(更高效,需注意类型对齐)
// uint8_t* float_ptr = (uint8_t*)&sensor_reading;
// for(int i=0; i<sizeof(float); i++){
//     tx_bytes[i] = float_ptr[i];
// }

// 逐个发送字节(替换为你的蓝牙发送API)
for(int i=0; i<sizeof(float); i++){
    ble_send_byte(tx_bytes[i]);
}

接收端还原

接收端收集齐所有字节后,反向操作还原为float:

#include <string.h>
#include <stdint.h>

uint8_t rx_bytes[sizeof(float)]; // 存储接收到的所有字节
float restored_data;

// 假设已通过蓝牙接收完所有字节并存入rx_bytes
// 方法1:memcpy还原
memcpy(&restored_data, rx_bytes, sizeof(float));

// 方法2:指针强制转换
// restored_data = *(float*)rx_bytes;

// 此时restored_data即为原始浮点数值

关键注意事项

  • 字节序一致性:如果发送端和接收端的CPU字节序不同(比如一个小端、一个大端),需统一字节序后传输:
    // 发送端:小端转大端(以4字节float为例)
    uint32_t temp = *(uint32_t*)&sensor_reading;
    tx_bytes[0] = (temp >> 24) & 0xFF;
    tx_bytes[1] = (temp >> 16) & 0xFF;
    tx_bytes[2] = (temp >> 8) & 0xFF;
    tx_bytes[3] = temp & 0xFF;
    
    // 接收端:大端转小端
    uint32_t temp = 0;
    temp |= (rx_bytes[0] << 24);
    temp |= (rx_bytes[1] << 16);
    temp |= (rx_bytes[2] << 8);
    temp |= rx_bytes[3];
    restored_data = *(float*)&temp;
    
  • 浮点格式确认:先通过sizeof(float)确认单片机的float字节数,若为8字节(double),则调整数组长度为8。
  • 传输校验:蓝牙易丢包,建议在字节数组末尾添加校验位(如所有字节异或值、求和取低8位),接收端验证后再还原,避免错误数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:42:41