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 + -
显示快捷键?