关于串口数据的接收,一大难点就是如何知道要接收的一帧数据结束。解决办法如下:
可以通过设计一个计时变量,这个计时变量在一个一毫秒的定时中断里面计数,当接收到一位数据时,把计时变量清零并让计时变量开始计数。这是,只要一直有数据需要接收,这个计时变量就一直为零。直到这一帧数据接收完毕,这个计时变量才会处于一直计数状态。这时,我们只需要判断这个计时变量是否超过某一个阈值,我们就可以判断这一帧数据是否接收完毕。建议这一个阈值设置为10。
一、代码示例
串口中断服务函数
void Sevice_Uart() interrupt 4
{
if(RI == 1)
{
EA = 0;
RI = 0;
value = SBUF;
RX_str[count_RX++] = value;//将接收到的数据存入数组中
stat_RX = 1;//表示接收到一位数据,让计时变量开始计时
num = 0;//计时变量清零
EA = 1;
}
}
void Sevece_timer0() interrupt 1
{
TL0 = 0x20; //设置定时初值
TH0 = 0xD1; //设置定时初值
if(stat_RX == 1)//表示接收到一位数据
{
num++;//开始计数
if(num == 10)//判断是否到达阈值
{
num = 0;
stat_RX = 0;
RX_str[count_RX] = '\0';//末尾加上结束符号
count_RX = 0;
stat_over = 1;//表示一帧数据以接收完成
}
}
}