⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdparse.txt

📁 用pic单片机实现的对锂电池冲电的程序
💻 TXT
字号:
使用LPC932制作的一款电表---CmdParse
redbug 发表于 2005-10-14 16:40:00  


#i nclude <REG932.H>
#i nclude <Define.h>
#i nclude <Stdio.h>
#i nclude <Intrins.h>

//数据发送
void SeriesSend(void)
{
    unsigned char data i,CheckSum;
    //发送标志有效,开始发送(上位机延时接收)
    if(SeriesSendFg)
    {
        ComDataBuf[8]=ComDataBuf[8]|0x80;
        CheckSum=0;    
        ComDataBuf[0]=0x68;
        for(i=10;i<(ComDataBuf[9]+11);i++)
        {
            ComDataBuf[i]=ComDataBuf[i]+0x33;
        }
        for(i=0;i<(ComDataBuf[9]+10);i++)
        {
          CheckSum=CheckSum+ComDataBuf[i];
        }
        ComDataBuf[ComDataBuf][9]+10]=CheckSum;
        ComDataBuf[ComDataBuf][9]+11]=0x16;
        SeriesSentByte(0xfe);
        SeriesSentByte(0xfe);
        for(i=0;i<ComDataBuf[9]+12;i++)
        {
            SeriesSentByte(ComDataBuf[i]);
        }
        SeriesSentByte(0xff);
        SeriesSentByte(0xff);
        ClerBuf();
        SeriesSendFg=0;
        SendOverFg=1;
    }
}
//编程密码校验---清零密码校验
unsigned char SnCheck(void)
{
    unsigned char i,j,k,m,n,SnIdA,SnIdB,SnCheckData;
    j=0x4c;
    k=0x50;
    m=13;
    SnCheckData=0;
    for(i=0;i<3;i++)
    {
        n=IicByteRead(0xa0,j);
        if(ComDataBuf[m]==IicByteRead(0xa0,j))
        {
           SnIdA=0x55;
        }
        else
        {
           SnIdA=0x00;
           break;
        }
        j++;
    }
    m=13;
    for(i=0;i<3;i++)
    {
        if(ComDataBuf[m]==IicByteRead(0xa0,k))
        {
           SnIdB=0x55;
        }
        else
        {
           SnIdB=0x00;
           break;
        }
        k++;
    }
    if(SnIdA==0x55)
    {
        SnCheckData=0x01;
    }
    else 
    {
        SnCheckData=0;
    }
    if(SnIdB==0x55)
    {       
        SnCheckData=0x01;
    }
    return SnCheckData;
}
//接收到的数据减0x33
void DataDeal(void)
{
    unsigned char i;
    CmdParseFg=0;
    for(i=10;i<ComDataBuf[9]+10;i++)
    {
        ComDataBuf[i]=ComDataBuf[i]-0x33;
        ComDataBuf[ComDataBuf][9]+10]=ComDataBuf[ComDataBuf][9]+10]-0x33;
    }
}
//数据提取
void CmdPick(unsigned char Device,unsigned char PickupAdd,unsigned char DataLen,bit MoveBit,unsigned char *value,unsigned char Lend,bit DataForIic,bit BcdChange)
{    
     unsigned char i,j;

     if(DataForIic)
     {
        if(MoveBit)
        {
           for(i=12;i<DataLen+12;i++)
           {
               j=PickupAdd; 
               ComDataBuf[i]=IicByteRead(Device,j<<4);
               PickupAdd++;
           }
        }
        else
        {
            for(i=12;i<DataLen+12;i++)
            {
               ComDataBuf[i]=IicByteRead(Device,PickupAdd);
               PickupAdd++;
            }
        }
        Lend=DataLen;
     }
     else
     {
         if(BcdChange)
        {
            for(i=12;i<Lend+12;i++)
              {
                  ComDataBuf[i]=HexToBcd(*value);
                  value++;
              }
        }
        else
        {
            for(i=12;i<Lend+12;i++)
              {
                  ComDataBuf[i]=*value;
                  value++;
              }
        }
     }
     ComDataBuf[9]=Lend+2;
     SeriesSendFg=1;
}
//接收到的数据保存
void CmdSave(unsigned char Device,unsigned char PickupAdd,unsigned char SaveAdd,unsigned char DataLen,bit MoveBit)
{
    unsigned char i,j,k;
    k=SnCheck();
    if(k)
    {
        if(MoveBit)
        {
            for(i=0;i<DataLen;i++)
            {
                j=SaveAdd;
                IicByteWrite(Device,j<<4,ComDataBuf[PickupAdd+i]);
                SaveAdd++;
            }
        }
        else
        {
            for(i=0;i<DataLen;i++)
            {
                IicByteWrite(Device,SaveAdd,ComDataBuf[PickupAdd+i]);
                SaveAdd++;
            }
        }        
        for(i=10;i<14;i++)
        {
             ComDataBuf[i]=ComDataBuf[i+4];
        }
        SeriesSendFg=1;
    }
    else
    {
        SeriesSendFg=0;
        CmdParseFg=0;
    }
}
//命令解析
void CmdParse(void)
{
    unsigned char data  CheckSum;
    unsigned char data i,j,k;
    unsigned char data IdRight;
    j=0x40; 
    //判断是否有未发送数据
    if(TimeSendFg)
    {
        //if(ComTimeA>=1)
        //{            
            SeriesSend();    
            TimeSendFg=0;            
        //}
    }
    else
    {
        //数据解析标志是否有效
        if(CmdParseFg)
        {
          DataDeal();
          CmdParseFg=0;
          CheckSum=0;
          //数据校验
          for(i=0;i<(ComDataBuf[9]+10);i++)
          {
            CheckSum=CheckSum+ComDataBuf[i]; 
          }
          //校验和是否相等--如果相等开始校验地址
          if(CheckSum==ComDataBuf[ComDataBuf][9]+10])
          {            
            for(i=0;i<6;i++)
            {
              k=IicByteRead(0xa0,j);
              if(ComDataBuf[1+i]==k)
              {
                IdRight=0x55;
              }
              else
              {
                IdRight=0x00;
                break;
              }
              j++;
            }
            //地址如果正确(非广播命令)开始解析命令
            if(IdRight==0x55)
            {                
                switch(ComDataBuf[8])
                {
                  case 0x01 : 
                              switch(ComDataBuf[11])
                              {
                                case 0x90:
                                            switch(ComDataBuf[10])
                                            {
                                              case 0x1f:  //读当前有功电量集合  
                                                          for(i=0;i<4;i++)
                                                          {
                                                            IIcBuf[i]=SumPulseData[i];
                                                          }
                                                          for(i=4;i<8;i++)
                                                          {
                                                            IIcBuf[i]=FengPulseData[i-4];
                                                          }
                                                          for(i=8;i<12;i++)
                                                          {
                                                            IIcBuf[i]=PingPulseData[i-8];
                                                          }
                                                          for(i=12;i<16;i++)
                                                          {
                                                            IIcBuf[i]=GuPulseData[i-12];
                                                          }
                                                           CmdPick(0,0,0,0,IIcBuf,16,0,1);
                                              break;
                                              case 0x20:  //读反向总电量
                                                          CmdPick(0x00,0x00,0x00,0,ReversePulseData,4,0,1);
                                              break;
                                            }
                                break;
                                case 0xb0:
                                            switch(ComDataBuf[10])
                                            {
                                              case 0x20:  //读最后一次反向启始时间
                                                          CmdPick(0xa0,0x38,4,0,0,0,1,0);
                                              break;
                                              case 0x21:  //读反向累积总时间
                                                          CmdPick(0x00,0x00,0x00,0,ReverseTime,3,0,0);
                                              break;
                                            }
                                break; 
                                case 0xb2:
                                            switch(ComDataBuf[10])
                                            {
                                              case 0x10:  //读最近一次编程时间
                                                          CmdPick(0xa0,0x3c,4,0,0,0,1,0);
                                              break;
                                              case 0x12:  //读编程次数
                                                          CmdPick(0xa0,0x68,2,0,0,0,1,0);
                                              break;
                                            }
                                break;  
                                case 0xc0:
                                            switch(ComDataBuf[10])
                                            {
                                              case 0x10:  //读当前日期
                                                          CmdPick(0,0,0,0,DaysBuf,4,0,0);
                                              break;
                                              case 0x11:  //读当前时间
                                                          CmdPick(0,0,0,0,TimeBuf,3,0,0);
                                              break;
                                              case 0x20:  //读电表运行状态字
                                                          CmdPick(0xa0,0x65,1,0,0,0,1,0);
                                              break;
                                              case 0x30:  //读电表脉冲常数
                                                          CmdPick(0xa0,0x6d,3,0,0,0,1,0);
                                              break; 
                                              case 0x32:  //读电表表号
                                                          CmdPick(0xa0,0x46,0x06,0,0,0,1,0);
                                              break;  
                                              case 0x33:  //读电表地址
                                                          CmdPick(0xa0,0x40,0x06,0,0,0,1,0);
                                              break;   
                                            }
                                break;
                                case 0xc1:
                                            switch(ComDataBuf[10])
                                            {
                                                case 0x17://读自动抄表日期
                                                          CmdPick(0xa0,0x60,0x02,0,0,0,1,0);
                                                break;
                                            }
                                case 0xc3:
                                            switch(ComDataBuf[10])
                                            {
                                                case 0x17://读电表时段
                                                          CmdPick(0xa0,0x60,0x02,0,0,0,1,0);
                                                break;
                                            }
                                break;  
                                case 0xD1:  //读取12个月历史累积电量
                                            for(i=0x20;i<0x2c;i++)
                                            {
                                                if(ComDataBuf[10]==i)
                                                {
                                                    ToDay(ComDataBuf[10]);
                                                    CmdPick(0xa2,IIcByteStar,16,0,0,0,1,0);
                                                }                                               
                                            } 
                              }
                  break;
                  case 0x04:  //写操作
                            if(KeyFg1)
                            {
                              switch(ComDataBuf[10])
                              {
                                  case  0x10: //写日期
                                              //
                                              CmdSave(0x64,16,0x03,4,1);
                                  break;
                                  case  0x11: //写时间
                                              CmdSave(0x64,16,0x00,3,1);                                               
                                  break;
                                  case  0x15: //显示设置
                                              CmdSave(0xa0,16,0x62,3,0);                                                
                                  break;
                                  case  0x17: //写自动抄表日
                                              CmdSave(0xa0,16,0x60,2,0);  
                                  break;
                                  case  0x19: //设置底度
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -