对于32位的系统来说,是以4个字节的方式来进行存储数据,但对于存储的多数据中混有小于4字节的数据来说,则需要特殊处理。若想实现按照实际数据顺序进行存储,处理方法如下:
1.处理定义的单个结构体中混有多种数据类型加“__packed”,例子:
typedef __packed struct
{
uint8 a;
uint8 b[2];
uint16 c;
uint32 d;
}
2.处理定义的多个结构体在需要处理的数据开头和结尾加“#pragma pack(1) ...(内容) #pragma pack()”,例子:
#pragma pack (1)
typedef struct {
union {
uint8 byte;
struct {
uint8 recuactworksts:2;
uint8 recufaultlevel:3;
uint8 recuactivedischgfb:2;
uint8 rsv:1;
}bits;
}recuworkinfo1;
uint16 recuactpowerfb;
uint16 recumaxpowerpermit;
union {
uint16 word;
struct {
uint8 recuoutofflvfb:2;
uint8 recuselfchkstate:2;
uint8 rsv:8;
uint8 recuworkinfoalivecnt:4;
}bits;
}recuworkinfo2;
uint8 recuworkinfochecksum;
}RECU_WorkInfo_ST;
typedef struct {
uint16 gcudclinkvoltage;
uint16 gcudclinkcurrent;
uint8 gcuactmotortemp;
uint8 rcv;
union {
uint8 byte;
struct {
uint8 gcumotorstsainvalid:1;
uint8 gcumotorinfoinvalid:1;
uint8 rcv:6;
}bits;
}recugcuinfo1;
uint8 rcv1;
}RECU_GCUInfo_ST;
#pragma pack ()
注:上面实例中蓝色部分数据是对数据细分到位进行处理
总结及常用的场景:
当接收到的一包数据中有多种类型时,可以先将数据对应的结构体定义好,再将数据复制到定义的结构体中,即将整包全部的数据都解析出来。实例:
#pragma pack (1)
typedef struct {
union {
uint8 byte;
struct {
uint8 recuactworksts:2;
uint8 recufaultlevel:3;
uint8 recuactivedischgfb:2;
uint8 rsv:1;
}bits;
}recuworkinfo1;
uint16 recuactpowerfb;
uint16 recumaxpowerpermit;
union {
uint16 word;
struct {
uint8 recuoutofflvfb:2;
uint8 recuselfchkstate:2;
uint8 rsv:8;
uint8 recuworkinfoalivecnt:4;
}bits;
}recuworkinfo2;
uint8 recuworkinfochecksum;
}RECU_WorkInfo_ST;
typedef struct {
uint16 gcudclinkvoltage;
uint16 gcudclinkcurrent;
uint8 gcuactmotortemp;
uint8 rcv;
union {
uint8 byte;
struct {
uint8 gcumotorstsainvalid:1;
uint8 gcumotorinfoinvalid:1;
uint8 rcv:6;
}bits;
}recugcuinfo1;
uint8 rcv1;
}RECU_GCUInfo_ST;
typedef struct {
uint8 enginecoolanttemp;
union {
uint8 byte;
struct {
uint8 oilpressurewarning:1;
uint8 rcv1:1;
uint8 enginemiltelltale:2;
uint8 rcv2:4;
}bits;
}recuemsinfo1;
uint16 enginespeedrpm;
uint16 recumaxpowerpermit;
union {
uint8 byte;
struct {
uint8 engstatusfbinvalid:1;
uint8 engstatusinfoinvalid:1;
uint8 rsv:6;
}bits;
}recuemsinfo2;
uint8 rcv;
}RECU_EMSInfo_ST;
typedef struct {
union {
uint8 byte;
struct {
uint8 faultlevel:2;
uint8 recuworkrequest:2;
uint8 carconnectstatus:2;
uint8 rsv:2;
}bits;
}cdzfaultlevel;
uint16 powerrequest;
uint8 rsv1[3];
union {
uint8 byte;
struct {
uint8 rsv:4;
uint8 recuctrlalivecnt:4;
}bits;
}cdzrecuctrl2;
uint8 recuctrlchecksum;
}CDZ_RECUCtrl_ST;
typedef struct {
uint8 rsv1[2];
uint16 bmscurrreq;
uint16 bmsvolreq;
uint8 rsv2[2];
}CDZ_BMSChgInfo_ST;
typedef struct {
uint16 bmsbattvol;
uint16 bmsbattcurr;
uint8 bmsbattsoc;
uint8 rsv1[3];
}CDZ_BMSBatInfo_ST;
#pragma pack ()
typedef struct {
CDZ_RECUCtrl_ST recuctrl;
CDZ_BMSChgInfo_ST bmschginfo;
CDZ_BMSBatInfo_ST bmsbatinfo;
}CDZTORECU_ST;
typedef struct {
RECU_WorkInfo_ST recuctrl;
RECU_GCUInfo_ST bmschginfo;
RECU_EMSInfo_ST bmsbatinfo;
}RECUTOCDZ_ST;
typedef struct {
CDZTORECU_ST cdz;
RECUTOCDZ_ST recu;
// ERR_STEP_ST err;
}DEV_RECU_TYPE;
typedef union {
uint8 data[8];
CDZ_RECUCtrl_ST Cdz_RecuCtrlData;
CDZ_BMSChgInfo_ST Cdz_BmsChgInfoData;
CDZ_BMSBatInfo_ST Cdz_BmsBatInfoData;
RECU_WorkInfo_ST Recu_WorkInfoData;
RECU_GCUInfo_ST Recu_GcuInfoData;
RECU_EMSInfo_ST Recu_EmsInfoData;
}CDZ_RECUData;