| 下面一段是单相液晶显示电表,判断校验和 是否正确, 的函数,有做电表的工程师解释下不,直接没弄懂 
 
 /**
 * @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);
 }
 }
 }
 
 |