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

