在编写PC与串口通信帧时或单片机与单片机通信帧时,经常会因为结构体对齐模式花费大量的时间进行调试,如声明一个结构体:
typedef struct
{
unsigned char Start; //表头
unsigned char Address; //从机地址
unsigned char Command; //命令号
unsigned int CRC; //循环校验码
}StructA;
常用方法:首先将结构体逐个赋值,然后编写一个程序调用结构体内部所有的数据并逐个按照协议发送出去。
缺点是复杂化,且极容易出现违法协议规则。
较好的使用方法是:
在声明结构体前部加上pack(1),VS2008上为“#pragma pack(1),从而使结构体对齐模式改为单字节对齐模式,而非编译器的优化
对齐模式,然后在函数内部直接将结构体用memcpy拷贝到发送缓冲器buffer中。
附录memcpy使用方法:
函数原型
void *memcpy(void*dest, const void *src, size_t n);
功能
由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
头文件