硬件平台:mk60dn512vll10
调试串口通信,自己自定义通信规约,有一帧结构如下typedef struct {
uint8_t SOF;
uint8_t LEN;
uint8_t CTL;
uint8_t ADDR;
uint8_t APN;
uint16_t PhaseAVolt;
uint16_t PhaseBVolt;
uint16_t PhaseCVolt;
uint8_t CS;
uint8_t ENDOF;
} _DATA;
帧开头 固定长度为5个字节,之后跟着一个16位2字节数据。接收串口数据的时候,再定义一个联合体如下
union _RCV_UNN {
uint8_t RcvBuf[LEN];
_DATA Data;
} Rcv;
调试过程中,发现 Rcv.Data.PhaseAVolt 总是出错,与主机发送的内容,总是错着一位。这时意识到是 内存对齐 问题,特别是数据结构存储的时候。
解决办法:
1. 如果定义结构体的时候,固定长度不是5个字节,而是 4字节或4的倍数,中间数据全都保持4的倍数个字节或单字节,就不会出现对齐问题;
2. 可以在编译器 工程文件 开头加入预处理命令 #pragma pack(1) // 设置变量以1字节对齐
|