借助T0定时器,不断的计数+1 接收到一帧数据(1Byte)后,串口中断服务函数将定时器T0计数清0(类似喂狗),并创建一个计数标志 一帧数据(1Byte)长度约为1.04ms[9600bps,1,0,1]。当串口中断数据接收完毕后,短时间无有效数据接收并进入中断服务函数,此时T0计数器不被清0,不断累加 持续检测到大于固定时间时,认为此刻一串数据已传输完毕。 固定时间间隔一般设置3-5倍的一帧数据长度(1.04ms)
UART中断服务函数处理: 接收到一个字节,打开T0计数软件标志,清一次计数器(计数器在T0定时器中一直在+1) - void uart_ISR() interrupt 4
- {
- if(RI)
- {
- RI = 0;
- timer_start = 1; //1. 接收到一帧数据时,打开T0软件计数器开始计数
- recv_buf[recv_Cnt] = SBUF;
- recv_Cnt++;
- if(recv_Cnt >= MAX_LENGTH) //超出开辟数组的保护处理,剩余掐断
- {
- recv_Cnt = MAX_LENGTH;
- }
- ctimer_Cnt = 0; //3. 一帧数据接收完成后,将T0计数单元清0,类似喂狗。但T0一直累加
- }
- }
复制代码
T0定时中断服务函数处理:
接收到串口一个字节数据到达标志,开始计数+1。判断计数累计循环次数,确定一串数据已发送完成
- void Timer0_ISR() interrupt 1
- {
- TR0 = 0; //进T0中断首先关闭定时器
- if(timer_start)
- {
- ctimer_Cnt++; //2. 接收到一帧数据后,定时时间计数单元开始计数
- if(ctimer_Cnt > MAX_RECV_TIME) //4. 一串数据接收完成后,下一帧无数据,此时ctimer_Cnt一直被累加,
- { // 当计时大于3ms,认为一串数据已接收完成,将完成标志置1
- ctimer_Cnt = 0;
- recv_flag = 1;
- cRealLen = recv_Cnt; //5. 一串数据传输完毕后,将实际长度输出,生成数组recv_buf[],由主函数处理解析
- recv_Cnt = 0;
- }
- }
- TL0 = 0x66; //装初值
- TH0 = 0xFC;
- TR0 = 1; //打开定时器T0
- }
复制代码 |