找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1012|回复: 1
打印 上一主题 下一主题
收起左侧

单片机串口定时中断超时接收 附源程序

[复制链接]
跳转到指定楼层
楼主
ID:948358 发表于 2022-6-5 13:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
借助T0定时器,不断的计数+1
    接收到一帧数据(1Byte)后,串口中断服务函数将定时器T0计数清0(类似喂狗),并创建一个计数标志
    一帧数据(1Byte)长度约为1.04ms[9600bps,1,0,1]。当串口中断数据接收完毕后,短时间无有效数据接收并进入中断服务函数,此时T0计数器不被清0,不断累加
    持续检测到大于固定时间时,认为此刻一串数据已传输完毕。
    固定时间间隔一般设置3-5倍的一帧数据长度(1.04ms)

UART中断服务函数处理:
    接收到一个字节,打开T0计数软件标志,清一次计数器(计数器在T0定时器中一直在+1)
  1. void uart_ISR() interrupt 4
  2. {               
  3.         if(RI)
  4.         {
  5.                 RI = 0;
  6.                 timer_start = 1;                        //1. 接收到一帧数据时,打开T0软件计数器开始计数
  7.                 recv_buf[recv_Cnt] = SBUF;
  8.                 recv_Cnt++;               
  9.                 if(recv_Cnt >= MAX_LENGTH)                //超出开辟数组的保护处理,剩余掐断
  10.                 {
  11.                         recv_Cnt = MAX_LENGTH;
  12.                 }
  13.                 ctimer_Cnt = 0;                                //3. 一帧数据接收完成后,将T0计数单元清0,类似喂狗。但T0一直累加        
  14.         }
  15. }
复制代码

T0定时中断服务函数处理:
接收到串口一个字节数据到达标志,开始计数+1。判断计数累计循环次数,确定一串数据已发送完成

  1. void Timer0_ISR() interrupt 1
  2. {        
  3.         TR0 = 0;        //进T0中断首先关闭定时器
  4.         if(timer_start)
  5.         {
  6.                 ctimer_Cnt++;                                        //2. 接收到一帧数据后,定时时间计数单元开始计数
  7.                 if(ctimer_Cnt > MAX_RECV_TIME)                //4. 一串数据接收完成后,下一帧无数据,此时ctimer_Cnt一直被累加,
  8.                 {                                                                        // 当计时大于3ms,认为一串数据已接收完成,将完成标志置1
  9.                         ctimer_Cnt = 0;                        
  10.                         recv_flag = 1;
  11.                         cRealLen = recv_Cnt;        //5. 一串数据传输完毕后,将实际长度输出,生成数组recv_buf[],由主函数处理解析                                
  12.                         recv_Cnt = 0;                                       
  13.                 }
  14.         }               
  15.         TL0 = 0x66;                //装初值
  16.         TH0 = 0xFC;
  17.         TR0 = 1;                //打开定时器T0
  18. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:390416 发表于 2022-6-6 10:50 | 只看该作者
单片机发送到串口助手,以及串口助手显示到LCD1602
http://www.51hei.com/bbs/dpj-214747-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表