嵌入式地址对齐引入的问题和解决方法
2026/5/5 15:40:19 网站建设 项目流程

背景

通过串口传输float类型数据,接收后将接收到的数组通过float_tval=*(float_t*)(u_buf+5)进行强制转换为float类型,概率性出错,进入了HardFault

问题原因

float为4字节对齐,uint8_t是1字节对齐,进行转换的数组位置不一定是4字节对齐的起始,所以出现HardFault。

当然,不同系统中传输过去的数据也要考虑大小端问题。STM32(常见为 Little Endian)下,低地址存放低字节;

解决方法

1.利用memcpy,将内容复制到float类型变量

#include <string.h> uint8_t u_buf22[] = {0xAA, 0x19, 0x04, 0x9E, 0x3F}; float f; memcpy(&f, u_buf22 + 1, sizeof(f)); // 安全地读取 4 字节到对齐的 float 变量 printf("value = %f\r\n", f);

2.利用uint32_t 组装再转换

uint32_t tmp = (uint32_t)u_buf22[1] | ((uint32_t)u_buf22[2] << 8) | ((uint32_t)u_buf22[3] << 16) | ((uint32_t)u_buf22[4] << 24); float f; memcpy(&f, &tmp, sizeof(f)); // 将位样复制到 float

3.利用union

union { uint32_t u; float f; } conv; conv.u = (uint32_t)u_buf22[1] | ((uint32_t)u_buf22[2] << 8) | ... ; printf("%f\n", conv.f);

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询