📄 recfunction.c
字号:
#include <stdio.h>
#include <reg51.h>
extern bit PacketValue ; // 0 没有带参数的包 1 带参数的包
extern unsigned char PacketID ; //包标识
extern unsigned char PacketData ; //包内容
extern bit revSuccess ; // 0 没接收成功 1 接收成功
extern unsigned char PacketMessage[10]; // 指向数据包内容参数的指针 // 因为参数的长度是不定的所以用指针而不能用数组
extern unsigned char MessageLength ; //参数的长度
extern unsigned char SendPacket[5] ;
unsigned char Num=0;
unsigned char Cont=0;
unsigned char revChar;
unsigned char PacketLength[2];
unsigned char test[4];
bit RevAddress=0;
bit RevHead=0;
bit checkHighWord=0;
bit revPacketLength=0;
unsigned int checksum=0;
unsigned int k=0;
unsigned char m=0;
void revFunction(void) interrupt 4 using 2
{
if(RI==1)
{
RI=0;
revChar=SBUF;
Num++;
if((Num==1) && (revChar==0x0EF))
RevHead=1;
if((Num==2) && (revChar==0x01) && (RevHead==1))//检测包头:0xFF01
Cont++;
if((Num==3) && (revChar==0xFF) && (RevHead==1))//检测模块地址 0xFF FF FF FF
Cont++;
if((Num==4) && (revChar==0xFF) && (RevHead==1))
Cont++;
if((Num==5) && (revChar==0xFF) && (RevHead==1))
Cont++;
if((Num==6) && (revChar==0xFF))
{
if(Cont==4)
{
Cont=0;
RevAddress=1;
}
else
{
Cont=0;
RevAddress=0;
}
}
if((Num==7) && (RevAddress==1)) // 收到有效地址
{
PacketID=revChar; // 检测包标识
checksum+=(int)revChar;
}
if((Num==8) && (RevAddress==1)) //PacketLength[0]放LENGTH的高字节 //PacketLength[0]放LENGTH的高字节
{
PacketLength[Num-8]=revChar; //检测包长度的高字节
checksum+=(int)revChar;
}
if((Num==9) && (RevAddress==1))
{
PacketLength[Num-8]=revChar; //检测包长度的低字节
m=PacketLength[1];
checksum+=(int)revChar;
revPacketLength=1 ;
RevAddress=0;
}
if((Num==10) && (revPacketLength==1)) //接收应答包的确认码
{
PacketData=revChar ;
checksum+=(int)revChar;
}
if((Num>10) && (PacketLength[1]>0x03) && (revPacketLength==1)) //获取应答包的参数
{
k=checksum;
MessageLength=PacketLength[1]-3; //应答包参数的长度(包长度减去2字节 的效验位和1字节的确认码
PacketMessage[Num-11]=revChar;
//获取包的内容的参数
test[Num-11]=revChar ;
checksum+=(int)revChar;
PacketValue =1; //带参数的包做标记
}
if((Num==8+PacketLength[1]) && ( revPacketLength==1)) //校验
{
k= checksum ;
if(checksum/256==revChar) //进行高字节效验
checkHighWord=1; //高字节效验成功
else
checkHighWord=0; //高字节效验失败
}
if((Num==m+8+1) && (revPacketLength==1)) //低字节校验
{
checksum=k;
if((checksum%256==revChar) && (checkHighWord==1))
{
revSuccess=1; //效验成功
}
else
{
revSuccess=0; //效验失败
}
ES=0;
Num=0;
checksum=0x0000;
checkHighWord=0;
revPacketLength=0;
} //EF 01 FF FF FF FF 07 00 03 00 00 0A
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -