查看: 2163|回复: 0
打印 上一主题 下一主题

电表代码不解

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-16 19:10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面一段是单相液晶显示电表,判断校验和 是否正确, 的函数,有做电表的工程师解释下不,直接没弄懂


/**
* @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);
                }
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表