最近在做一个项目,项目用到了串口收发,波特率设置较高,又不确定数据长度,数据长度主要体现在第二个字节和第三个字节中,因此就不能使用常规的接收中断进行处理,如在中断中进行数据处理,由于时间较长,势必造成丢包的现象发成,这是绝对不允许出现的,如果在主函数中处理,会造成数据覆盖和判断出现漏洞的问题(由于协议原因),这问题也一直困扰了两天,后来翻看大神的博客,发现了IDLE中断,该中断一般情况不太常用,但是对于该项目真是药到病除,首先IDLE中断为空闲中断,也即是当一帧全部接收完成了,触发该中断,这样,我们就可以在主函数中来处理这一帧数据,从而完美解决丢包,数据覆盖的问题,但是细细分析发现,当帧与帧之间用时较短时,或许还会出现丢包情况(楼主有强迫症啊,这种情况估计没有,哈哈)。
接下来就是IDLE配置问题了,初始化配置很简单,像配置接收中断一样,直接开启就好了,在清除标志位的时候就稍微需要注意了,如果是F0系列的单片机,需要用ICR寄存器来清除(我也没用,没验证),如果是F1系列的单片机,首先需要读取SR寄存器,再读DR寄存器,即可清除空闲中断标志位(亲测可用);顺便也普及一下,接收中断标志位,读取接收寄存器即可清除中断(不放心的小伙伴可以使用函数再次清除),发送中断标志位,读取发送中断标志位即可清除,一般情况用个while就好了。非常感谢 main_h_ 的帖子,我这写的比较笼统啊,具体的可以参考main_h_的帖子,网址链接http://blog.csdn.net/main_h_/article/details/55668953
IDLE空闲标志位,当10个连续的逻辑1(M=0)或11个连续逻辑1(M=1)出现在接收输入时,IDLE被置位。
接受寄存器非空标志位只有接收移位寄存器数据全部移位到接收寄存器后才置位。