cmdparse.c

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

C
464
字号
/*========================================*/
/*系统名称:DDSF-CECG-JiangSu             */
/*函数名称:数据解析  		              */
/*程序编写:步爱军			              */
/*开始日期:2005-01-01			          */
/*完成日期:				              */
/*修改记录:  				              */
/*软件版本:DDSF-CECG-002                 */
/*版本说明:用户数据保存在外部            */
/*外部器件:LM75、AT24C02、HT1621、LPC932 */
/*          R8025、ADE7755                */
/*========================================*/

#include <REG932.H>
#include <Define.h>
#include <Stdio.h>
#include <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>=5)
		{			
			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)

⌨️ 快捷键说明

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