📄 rec_analysis.c
字号:
#include "recframe.h"
#include "Rec_Analysis.h"
#include "process.h"
/*********************************************************************
* 函 数 名: Rec_Analysis
* 功能描述: 判断每一个接收字节,进行状态转移,置标识位
* 函数说明: 帧头68H,帧尾16H
* 调用函数: 无
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
***********************************************************************/
void Rec_Analysis(void)
{
uchar ch,i;
static uchar RecCount,RecState,count, DataLen,cs;
if(s_end==0) //数据没有发送完,返回
return;
ch=SBUF;
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==5)
{
if(RecBuf[4]!=FRAME_START_CHAR) //若不是帧起始字符,返回到等待状态
{
RecCount=0;
RecState=RS_WAIT;
break;
}
}
if(count==6)
{
fc_flag=0;
switch(RecBuf[5])
{
case 0:
fc_flag=0x00;
break;
case 1:
fc_flag=0x01;
break;
case 2:
fc_flag=0x02;
break;
case 4:
fc_flag=0x04;
break;
case 5:
fc_flag=0x05;
break;
case 6:
fc_flag=0x06;
break;
case 7:
fc_flag=0x07;
break;
case 10:
fc_flag=0x0a;
break;
case 11:
fc_flag=0x0b;
break;
case 12:
fc_flag=0x0c;
break;
default:
RecCount=0;
RecState=RS_WAIT;
break;
}
}
if(count==7) //第7个字节为数据域长度字节
{
DataLen=ch;
if(ch==0) RecState++;
RecState++;
count=0;
break;
}
break;
case RS_DATA:
count++;
if(count==DataLen)
RecState++;
break;
case RS_CHECK:
cs=0;
for(i=0;i<RecCount-1;i++)
cs+=RecBuf[i];
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;
p_end=0;
s_end=0;
RecCount=0;
rec_lamp=!rec_lamp;
}
else
RecCount=0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -