Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2933|回复: 0

03-单片机接收数据之空闲中断

[复制链接]

56

主题

56

帖子

224

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
224
发表于 2020-9-21 09:34:14 | 显示全部楼层 |阅读模式



1. 前言
在单片机通信项目中,经常会用到接收数据,然后处理.大家有没有想过什么方式才是最优的方式?
大家是否想过有没有什么标准的方案可以解决一切可能?
注:此节并不是标准的方案,这节只是作为抛砖引玉!
2.想想下面的例子
假设单片机接收的数据为
0x55 0xAA 0x03 0x05 0x03 0x22 0x34 0x56 0x12 0x45 0xAA 0x55
0x55 0xAA作为数据的开头,中间是数据,0xAA 0x55作为数据的结尾
你会怎么做?
青铜这样做
串口中断里面判断数据头,数据尾,判断接收完了一整条数据
819239-20200822201643167-1290207347.png


主循环这样做
我用返回接收的数据,代表处理数据
819239-20200822201707883-1175895974.png


测试
819239-20200822201727728-1569029282.png


上面的程序有好多问题.我就说其中一个
如果我还有其它不同的数据,串口里面就要弄好多判断.

白银这样做
用定时器判断接收到一条数据之后再去处理
思路:
如果接收到数据,控制空闲累加变量1ms做一次加1操作
串口如果一直接收数据则清零空闲时间累加变量
如果空闲累加变量累加到10,说明接收完了数据
串口中断:
819239-20200822201810900-1463154497.png


定时器
819239-20200822201820478-1244422442.png


主函数:
819239-20200822201832808-714845707.png



测试:
819239-20200822201845358-913221462.png


利用每条数据之间的空隙,来判断接收完一条数据以后再去做处理!
上面的程序还是不够完美,因为少于10ms间隙的数据是判断不出来的
黄金这样做
STM32自带空闲中断!
打开空闲中断:
819239-20200822201934730-1395220425.png


串口中断修改:
819239-20200822201951312-1090460787.png


主函数:
819239-20200822202004325-982765988.png


测试:
819239-20200822202016299-1246867242.png



结语
以上程序可以满足大部分简单的通信处理
主要思路就是判断接收完了一条数据以后再去处理.
但是以上程序并不是最优的程序
上面程序有个共同的通病,如果数据过来的比较快,处理数据慢,则就会丢失数据!

当前才到 黄金级别
后面我给大家准备了 最强王者和荣耀王者

回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2020-10-31 19:36 , Processed in 0.084198 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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