下面一段是单相液晶显示电表,判断校验和 是否正确, 的函数,有做电表的工程师解释下不,直接没弄懂
/**
* @brief 电量累加前检测存贮的电量的校验和是否有误。如果有误就依据3中取2获得电量
* @param chk_id 数据的ID号
* @return void
*/
void check_engint(unsigned int chk_id)//检测校验和函数 ??
{
unsigned char i,j,k,num,value,datanum;
Word32 recover_buff;
uint32 recoverdata[3];// unsigned long
for(i=0;i<4;i++)
wr_buff=0; //读写缓存
value=0;
k=0;
num=addr_from_coreID(1,chk_id); //函数功能:根据数据ID号获取数据
for(i=0;i<num;i++)
{
if((*ID_coretalbpoint).stortype==EEPROM) //数据存贮类型 ?? //核心数据指针
{
data_addr.word[1]=(*ID_coretalbpoint).dataaddr; //读写地址
datanum=(*ID_coretalbpoint).datalong; //数据长度
Read_data(EEPROM,datanum);
wr_buff[datanum]=0; //读写缓存 //读写缓存
recover_buff.lword=0; //??
for(j=0;j<datanum-1;j++) //校验和判断
{
wr_buff[datanum]+=wr_buff[j];
recover_buff.byte[j]=wr_buff[j]; //保存读出来的数据
}
recoverdata[k++]=recover_buff.lword;
if(wr_buff[datanum]==(wr_buff[datanum-1]-0x33)) //如果校验和正确
{
if(check_X_bcd((datanum-1),wr_buff)==1) //BCD嘛校验 检测X个字节是否为BCD码
{
value=1; //检测到合法数据,放在wr_buff中
break;
}
}
}
}
if(value==0) //EEPROM中恢复数据错误
{
if(one_from_three(recoverdata)==1) //三中取二成功 三中取二,如果符合三种取二的要求就将最终的数据放在数组第一个里
{
recover_buff.lword=recoverdata[0];
if(check_X_bcd(4,recover_buff.byte)==1) //BCD码校验正确 检测X个字节是否为BCD码
{
for(j=0;j<datanum-1;j++)
{
wr_buff[j]=recover_buff.byte[j]; //恢复合法数据
value=1;
}
}
}
if(value==0) //如果没有恢复合法数据,从零开始计量
{
for(j=0;j<datanum-1;j++)
wr_buff[j]=0;
}
}
for(i=0;i<num;i++)
{
if((*ID_coretalbpoint).stortype==RAM) //数据存贮类型
{
data_addr.word[1]=(*ID_coretalbpoint).dataaddr;
datanum=(*ID_coretalbpoint).datalong-1;
Write_data(RAM,datanum);
}
}
}
|