|
#include
unsigned char flag,rcvdat,retval,sumchkm,xorchkm;
unsigned char state_machine[11];
void main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
if(state_machine == 0) // 协议解析状态机
{
if(rcvdat == 0x55) // 接收到帧头第一个数据
state_machine = 1;
else
state_machine = 0; // 状态机复位
}
else if(state_machine == 1)
{
if(rcvdat == 0xAA) // 接收到帧头第二个数据
state_machine = 2;
else
state_machine = 0; // 状态机复位
}
else if(state_machine == 2)
{
if(rcvdat == 0x7E) // 接收到帧头第三个数据
state_machine = 3;
else
state_machine = 0; // 状态机复位
}
else if(state_machine == 3)
{
sumchkm = rcvdat; // 开始计算累加、异或校验和
xorchkm = rcvdat;
if(rcvdat == m_SrcAdr) // 判断目的地址是否正确
state_machine = 4;
else
state_machine = 0;
}
else if(state_machine == 4)
{
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(rcvdat == m_DstAdr) // 判断源地址是否正确
state_machine = 5;
else
state_machine = 0;
}
else if(state_machine == 5)
{
lencnt = 0; // 接收数据计数器
rcvcount = rcvdat; // 接收数据长度
sumchkm += rcvdat;
xorchkm ^= rcvdat;
state_machine = 6;
}
else if(state _machine == 6 || state _machine == 7)
{
m_ucData[lencnt++] = rcvdat; // 数据保存
sumchkm += rcvdat;
xorchkm ^= rcvdat;
if(lencnt == rcvcount) // 判断数据是否接收完毕
state_machine = 8;
else
state_machine = 7;
}
else if(state_machine == 8)
{
if(sumchkm == rcvdat) // 判断累加和是否相等
state_machine = 9;
else
state_machine = 0;
}
else if(state_machine == 9)
{
if(xorchkm == rcvdat) // 判断异或校验和是否相等
state_machine = 10;
else
state_machine = 0;
}
else if(state_machine == 10)
{
if(0x0D == rcvdat) // 判断是否接收到帧尾结束符
{
retval = 0xaa; // 置标志,表示一个数据包接收到
}
state_machine = 0; // 复位状态机
}
}
void ser() interrupt 4
{
RI=0;
P1=SBUF;
flag=1;
|
|