📄 recframe.c
字号:
#include "recframe.h"
#include "recframeown.h"
#include "time.h"
/*********************************************************************
* 函 数 名: StatSwitch
* 功能描述: 判断每一个接收字节,进行状态转移,置标识位
* 函数说明: 帧头68H,帧尾16H
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:zy
***********************************************************************/
void StatSwitch()
{
register uchar i,ch;
static uchar RecCount,RecState,dl,count, DataLen,cs;
ch=SBUF;
if(s_end==0) //数据没有发送完,返回
return;
RecBuf[RecCount]=ch; //将接收到的字节存入缓冲区
RecCount++;
switch(RecState)
{
case RS_WAIT:
if(ch==FRAME_START_CHAR)
{
RecState++;
count=1;
}
else
RecCount=0;
break;
case RS_HEADER:
count++;
if(count==2)
{
if(RecBuf[1]==add[0])
hcode=1;
else if(RecBuf[1]==0)
hcode=0;
else
{
RecCount=0;
RecState=RS_WAIT;
break;
}
}
if(count==3)
{
if(RecBuf[2]==add[1])
mcode=1;
else if(RecBuf[2]==0)
mcode=0;
else
{
RecCount=0;
RecState=RS_WAIT;
break;
}
}
if(count==4)
{
if(RecBuf[3]==add[2])
lcode=1;
else if(RecBuf[3]==0)
lcode=0;
else
{
RecCount=0;
RecState=RS_WAIT;
break;
}
if((add_flag!=0)&&(add_flag!=4)&&(add_flag!=6)&&(add_flag!=7))
{
RecCount=0;
RecState=RS_WAIT;
break;
}
}
if(count==5)
{
if(RecBuf[4]!=FRAME_START_CHAR) //若不是帧起始字符,返回到等待状态
{
RecCount=0;
RecState=RS_WAIT;
break;
}
}
if(count==6)
{
fc_flag=0;
switch(RecBuf[5])
{
case 0:
sinit=1;
break;
case 1:
ctime=1;
dl=6;
break;
case 2:
wport=1;
dl=4;
break;
case 3:
rport=1;
dl=0;
break;
case 4:
rcout=1;
dl=1;
break;
case 5:
burst=1;
dl=1;
break;
case 11:
fc_flag=0x50;
dl=1;
break;
case 12:
fc_flag=0x70;
dl=1;
break;
case 13:
sday=1;
dl=0;
break;
case 14:
fc_flag=0x60;
dl=0;
break;
case 22:
stime=1;
dl=1;
break;
case 23:
fc_flag=0x30;
dl=1;
break;
case 16: //抄表一次轮询结束命令
cycend=1;
dl=1;
break;
/* case 18:
gburst=1;
dl=2;
break;
*/ case 19:
alarm_ac=1;
dl=0;
break;
default:
RecCount=0;
RecState=RS_WAIT;
break;
}
}
if(count==7) //第7个字节为数据域长度字节
{
DataLen=ch;
if(fc_flag==0x80)
{
RecState++;
count=0;
break;
}
if(DataLen==dl)
{
RecState++;
count=0;
if(DataLen==0) //如果数据长度为0,进入接收校验和状态
RecState++;
}
else
{
RecCount=0;
RecState=RS_WAIT;
break;
}
}
break;
case RS_DATA:
count++;
if(count==DataLen)
RecState++;
break;
case RS_CHECK:
cs=0;
for(i=RecCount;i>1;i--)
cs+=RecBuf[i-2];
if(cs!=RecBuf[RecCount-1]) //校验和不正确,返回到等待状态
{
RecCount=0;
RecState=RS_WAIT;
break;
}
else
RecState++;
break;
case RS_END:
RecState=RS_WAIT;
if(ch==FRAME_END_CHAR) //如果帧结束字符正确,置接收结束标识位
{
r_end=1;
s_end=0;
delay_10ms=0;
RecCount=0;
}
else
RecCount=0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -