结构体校验码异常

调试的时候,发现加在结构体后面的校验码总是不对,在此做个笔记。

问题出在结构体对齐上,虽然校验码在最后的位置,但是由于结构体对齐的问题,实际结构体是4字节对齐,会在最后面补上2字节。所以在计算结构体校验码的时候做法是减去最后两个校验码,但是校验码并不在这里,而是更前面的2个字节,所以就会出现,在第一次算完校验码,写入 后,在读取在算校验码,就不对了。因为第一次计算算入了刚才的校验码结果作为校验数据

typedef struct
{  
  alarmParamStruct_int32_t cellOverVoltage;
  alarmParamStruct_int32_t cellUnderVoltage;
  alarmParamStruct_int32_t totalOverVoltage;
  alarmParamStruct_int32_t totalUnderVoltage;
  alarmParamStruct_int32_t dischargeOverTemperature;
  alarmParamStruct_int32_t chargeOverTemperature;
  alarmParamStruct_int32_t MOSTemperatureOver;
//  alarmParamStruct_int32_t envirenmentOver;
//  alarmParamStruct_int32_t envirenmentUnder;
  alarmParamStruct_int32_t dischargeUnderTemperature;
  alarmParamStruct_int32_t chargeUnderTemperature;
//  alarmParamStruct_int32_t SOCOver;
//  alarmParamStruct_int32_t SOCUnder;
  alarmParamStruct_int32_t dischargeOverCurrent;
  alarmParamStruct_int32_t chargeOverCurrent;
  alarmParamStruct_uint16_t envirenmentOver;
  alarmParamStruct_uint16_t envirenmentUnder;
  alarmParamStruct_uint16_t SOCOver;
  alarmParamStruct_uint16_t SOCUnder;
  alarmParamStruct_uint16_t voltageDiff;
  uint16_t sumCheck;
}alarmParamSettingStruct;

uint16_t length = sizeof(AlarmParmStruct);
AlarmParmStruct.sumCheck = crc16((uint8_t*)&AlarmParmStruct,length-2);

为了让校验码在最后两个字节,需要在它前面手动补齐2字节,作为占位符。

typedef struct
{  
  alarmParamStruct_int32_t cellOverVoltage;
  alarmParamStruct_int32_t cellUnderVoltage;
  alarmParamStruct_int32_t totalOverVoltage;
  alarmParamStruct_int32_t totalUnderVoltage;
  alarmParamStruct_int32_t dischargeOverTemperature;
  alarmParamStruct_int32_t chargeOverTemperature;
  alarmParamStruct_int32_t MOSTemperatureOver;
//  alarmParamStruct_int32_t envirenmentOver;
//  alarmParamStruct_int32_t envirenmentUnder;
  alarmParamStruct_int32_t dischargeUnderTemperature;
  alarmParamStruct_int32_t chargeUnderTemperature;
//  alarmParamStruct_int32_t SOCOver;
//  alarmParamStruct_int32_t SOCUnder;
  alarmParamStruct_int32_t dischargeOverCurrent;
  alarmParamStruct_int32_t chargeOverCurrent;
  alarmParamStruct_uint16_t envirenmentOver;
  alarmParamStruct_uint16_t envirenmentUnder;
  alarmParamStruct_uint16_t SOCOver;
  alarmParamStruct_uint16_t SOCUnder;
  alarmParamStruct_uint16_t voltageDiff;
  uint16_t alignUse;
  uint16_t sumCheck;
}alarmParamSettingStruct;

这样得到的结果就对了,最后2为是校验码。

00> 191~crc16=51658;data=0**
00> 192~crc16=19085;data=244**
00> 193~crc16=36026;data=1**
00> 194~crc16=14635;data=0**
00> 195~crc16=11158;data=0**
00> 196~crc16=38650;data=0**
00> 197~crc16=63860;data=0**
00> 198~crc16=30230;data=0**
00> 199~crc16=38711;data=0**
00> #################
00> length=200**
00> 191~crc16=51658;data=0**
00> 192~crc16=19085;data=244**
00> 193~crc16=36026;data=1**
00> 194~crc16=14635;data=0**
00> 195~crc16=11158;data=0**
00> 196~crc16=38650;data=0**
00> 197~crc16=63860;data=0**
00> 198~crc16=63143;data=55**
00> 199~crc16=9797;data=151**
00> *****************
00> length=200**
00> 191~crc16=51658;data=0**
00> 192~crc16=19085;data=244**
00> 193~crc16=36026;data=1**
00> 194~crc16=14635;data=0**
00> 195~crc16=11158;data=0**
00> 196~crc16=38650;data=0**
00> 197~crc16=63860;data=0**
00> 198~crc16=63143;data=55**
00> 199~crc16=9797;data=151**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值