cmdparse.c

来自「个人学习参考!禁止使用到产品上! 任何人不得公开发布!」· C语言 代码 · 共 464 行 · 第 1/2 页

C
464
字号
              {
                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: //设置底度
                                              //电度清零
                                              CmdSave(0xa0,16,0x00,16,0);//总电量清零            
                                  break;
                                  case  0x32: //设置表编号
                                              CmdSave(0xa0,16,0x46,6,0);//
                                  break;
								  case  0x33: //设置表地址
                                              CmdSave(0xa0,16,0x40,6,0);//
                                  break; 
                                  case  0x3f: //设置时段
                                              CmdSave(0xa0,16,0x80,ComDataBuf[9]-6,0);//
                                  break; 
                                  default:
                                             
                                  break;
                              }  
                            }
                            else
                            {
                                switch(ComDataBuf[10])
                              {
                                  case  0x11: //写时间
                                              TimeChk(ComDataBuf[16],ComDataBuf[17]);
                                              if(TimeOk);
                                              {
                                                  CmdSave(0x64,16,0x00,3,1);
                                                  TimeOk=0;
                                              }                                                      
                                  break;
                              } 
                            }                                         
                  break;
                  case 0x0f:  //修改编程密码
				  			  if(ComDataBuf[14]==0x01)
							  {
				  			  	  CmdSave(0xa0,15,0x4c,4,0);//修改编程密码
							  }
							  else if(ComDataBuf[14]==0x00)
							  {
								  CmdSave(0xa0,15,0x50,4,0);//修改清令密码
							  }
                  break;
				  case 0x1f:  //电表总清零
				  			  if(ComDataBuf[9]==0x04)
							  {
				  			  	  ClerData();
							  }
                  break;
                } 
                TimeSendFg=1;
            }
            //否则判断是否是广播命令
            else
            {
              IdRight=0;
              for(i=0;i<6;i++)
              {
   			     if(ComDataBuf[1+i]==0x99)
                 {
                   IdRight=0x55;
                 }
                 else
                 {
                   IdRight=0x00;
                   break;
                 }
                 j++;
              }
              //如果是广播命令开始解析
              if(IdRight==0x55)
              {				
				switch(ComDataBuf[8])
                {
                    case 0x08:  //广播校时
                               CmdSave(0x64,15,0x00,3,1);//设置时间
                    break;  
					case 0x0a:  //广播地址
                               CmdSave(0x64,15,0x00,3,1);//设置时间
                    break;  
                }
                TimeSendFg=1;
              }
			  else
			  {
				  ClerBuf();
				  SendOverFg=1;
			  }
              CmdParseFg=0;
            }
          }
          else
          {
            CmdParseFg=0;
          }
       }
	}	
}

⌨️ 快捷键说明

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