简介
这篇文章介绍了串口+DMA的发送过程:记群内因串口DMA发送而引发的讨论_哈士奇去买菜的博客-CSDN博客
本文将介绍基于串口+DMA循环模式+循环队列的接收过程。其最大的优点是每次接收完成后不需要禁止MDA通道然后重新配置接收长度。并且还支持接收不定长数据。
USART的IDLE中断
我已经写过IDLE中断的解释,请参考:GD32F130之USART串口通信_哈士奇去买菜的博客-CSDN博客_gd32f130串口
这里需要补充强调的是,当本机串口检测到IDLE中断时,只是说明对方已经结束了一串连续的串口帧发送过程,而不一定说明对方已经完成了一包应用层数据的发送。首先串口通信本身没有规定串口帧之间的间隔时间,可以没有间隔,或者可以有任意长间隔。其次,对方在发送一包应用层数据的时候,可能在发送过程中被中断打断,导致发送产生间隔,从而会让本机产生IDLE中断。
在DMA接收方式下,IDLE中断用于告诉应用程序,对方已经完整发送了一包数据,或者,对方只发送了一包数据的一部分。因此,在IDLE中断发生时,应该检查收到数据的完整性,只有收到了完整的数据,才去分析处理这个数据。最好的做法是在应用层设计一个串口通信协议,使用帧头和帧尾以及校验来协助检查数据的完整性和合法性。