有朋友问起串口接收超时的处理,简单说明如下,以51为例,仅提供一个思路,供参考
问题: 串口接收数据,一帧32字节,收满32字节处理一次,但是有可能丢失数据,也就是收不满32字节,如何做超时处理?
假设 : 串口通信格式 9600,n,8,1 ,则传输32字节需要33.333毫秒,则可以判断40毫秒没有接到完整的一帧数据,则超时,做超时处理。
具体处理方式:
接收一帧数据标志:
RcvFlag = 0;
定义一个接收缓冲区数组:
RcvData[48];
接收数据计数器:
RcvCnt = 0;
超时计数器:
TimeOutCnt = 0
定时器中断,设置为5毫秒中断一次,则中断8次,达到40毫秒。
串口接收中断
void RcvInt(void) interrupt 4 using 2
{
if(RI==1)
{
if(TimeOutCnt==0)
TimeOutCnt = 10;
RcvData[RcvCnt++] = SBUF;
if(RcvCnt>=32)
{
RcvFlag = 1; //收到一帧完整的数据
TimeOutCnt = 0;
}
}
}
定时器中断处理:
void timer(void) intterupt 2 using 1
{
重装定时器 ;
if(TimeOutCnt>2)
TimeOutCnt --;
else
{
RcvCnt = 0; //接收计数器清0
TimeOutCnt = 0; //超时计数器清0
}
}
}
//其他处理
}
主程序处理
main()
{
//初始化
//其他处理
//接收数据处理
if(RcvFlag)
{
//判断处理数据
RcvFlag= 0;
RcvCnt = 0;
}
}