📄 cmdparse.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 + -