摘自:https://blog.csdn.net/wuhenyouyuyouyu/article/details/53377946
https://blog.csdn.net/euxnijuoh/article/details/64446862
http://www.51hei.com/bbs/dpj-39885-1.html
IDLE中断什么时候发生?
IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。
RXNE中断和IDLE中断的区别?
当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。
如果波特率为9600,发送一个位需要的时间为1/9600s=0.0001042s=0.1042ms,这里按数据位为8位,停止位为2位, 加起来就是10位,10个位发送所需的时间为:0.104210ms = 1.042ms,如果我要发送10个字节的数据,那发送这10个字节数据给接收方需要的时间为:101.042ms = 10.42ms,这是算实际的发送10个字节的数据所需要的时间。我们在接收方接收数据时可以把时间再加宽一些,让它有一点余量。让接收方能稳定的把数据从发送方接手过来,可以加个5ms,或更宽一点10ms, 加上发送10个字节所花的时间,就是15ms或20ms。
TIMER_OUT方法,9600波特率,发送一个字节大约需要1ms时间,假如认为发送是连续的而不是断续的,那么我是否可以认为你在超过1MS时间(为了留有足够的富裕时间,认为20MS)没有接收中断发生,我就可以认为接收完毕接着通知APP或者协议解析模块去解析协议。但是这么处理有几个问题需要注意:
1、如果对方用的查询方式发送,那么需要获得对方的最大发送间隔;
2、帧于帧之间发送间隔必须大于接收方设定的TIMER_OUT时间;(其实这段不满足的话,也可以处理,在RAM资源足够的情况下,协议解析模块按着解析多帧的思路去写)
3、整个通信带宽被拉低,因为帧间隔是TIMER_OUT时间,肯定是MS级以上,一般20~50ms吧;但是这种方法是最简单的,也适合解耦,便于模块化封装。
STM32 USART
最新推荐文章于 2023-12-05 15:11:50 发布