发布网友 发布时间:2022-04-24 09:06
共1个回答
热心网友 时间:2022-06-18 09:21
//******************************
//变量声明
//*****************************
unsigned char TimeCount; //用于计时,初始化为零
unsigned char Byte_Count; //用于记录当前帧接收到的字符数,
//初始化为零
bit MssgRdy; //一帧接收完毕标志位
unsigned char Buff[150]; //数据缓冲区
//--------------------------------------------------------------
void Initial_()
{
//此处就是写串口初始化
//以及定时器0、 1的初始化
//还有相关变量的初始化
}
//串口中断server
void Get_Message() interrupt 4 using 2
{
if(RI==1)
{
RI=0;
TimeCount=0; //计数值回零
Byte_Count=Byte_Count+1;
Buff[Byte_Count]=SBUF;
}
}
void Timer0Server() interrupt 1 using 3
{
TH0=0X4C;
TL0=0X00; //定时50Ms
TimeCount=TimeCount+1;
if(TimeCount==10) //说明一帧已经结束
{
//TimeCount=0; //本来想在此处将TimeCount回零,但是如此
//一来可能会导致一个命令帧多次处理的情况
Byte_Count=0;
MssgRdy=1;
}else if(TimeCount>=250)
{
TimeCount=250; //限幅
}
}
// 大概就是这样子了,在主程序里面就是查看MssgRdy标志位判断帧是否接收
//完毕,若接收完毕就解析、处理帧。
// 另外,我不知道你的命令帧是否有特定的帧结构,上面的程序判断一帧完
//毕的条件是空闲时间超过了500ms,如果有特定的帧结束符,那就可以省下
//Timer0这个资源了。
// 上面的程序我没有在编译器中编译过的,你自己在Keil上排错吧,见笑了