关于个人对UART+DMA +串口空闲中断的理解与疑惑

   以下只是个人根据自己实际项目的使用在论坛里看到的一些交流的理解,欢迎大家指出其中理解错误的地方。

1. 我为什么选择了 串口+DMA+空闲中断模式

  在网上去搜索会看到很多的资料与简介,甚至还有许多实例程序,这里我就不在重复介绍。当初我选择这种模式来进行处理接收串口数据有以下几个原因。

 1. 实际中我是用串口去接收一种船舶上发出的报文数据(AIS数据),你当成GPS就行了。这种数据会根据周围的船舶的数量的多少,串口接收数据的频率也会不同。目前实测 最多的 1S可以接收5帧左右的数据,1帧数据大约在50~100个字符。所以我为了节约处理器性能采用了这种模式。

 2.纯粹是为了偷懒,觉得采用了这种模式接收,完全可以高枕无忧的接收数据,不用自己去写什么接收程序和处理程序。

 3.初次接触这种模式,觉得真的很牛。过度迷恋。

 2. 实际使用过程中遇到的问题以及处理方法

  1. 一般情况下,这种模式做串口数据接收还是非常的好用,但是这是一般的情况下。下面内容来自论坛的讨论:

关于个人对UART+DMA +串口空闲中断的理解与疑惑

 

关于个人对UART+DMA +串口空闲中断的理解与疑惑

  2. 实际使用的过程我,我确实也遇到了问题。偶尔会出现数据粘连在一起的情况,比如下面这样本来应该一帧数据触发一次的空闲中断,却是几帧数据粘连一起触发的情况。

   !AIVDM,1,1,,B,B6:hqcP009qvSMT>fk<03wQ6kP06,0*14     (理论上应该一帧触发一次)

   实际上我在实测过程中发现,触发一次的时候却出现了几帧当一帧的情况。 

   !AIVDM,1,1,,B,B6:hqcP009qvSMT>fk<03wQ6kP06,0*14

   !AIVDM,1,1,,A,B6:[email protected]>4>ke`03wv41P06,0*30

   !AIVDM,1,1,,B,16:bdTQP1;[email protected]`ugv820Sw,0*30

   其实这个问题也好解决,只要我们再次手动处理一下数据,分割一下即可,实际中我也是这么做的。但是可能是自己能力不足,又或者是我没有考虑其他的什么意外情况,就算我切割后,我解码数据会偶尔出现乱码,这也说明了串口数据接收有问题或者是切割有问题。由于这些问题只有在现场才能调试,实际这样的数据又很少能遇到一次,至今我也没解决。自己在实验室模拟完全没问题。(果然模拟和实际还是差很多的,实际要考虑很多意外的情况,就像上面图片中看到的说的情况一样)

  3.目前有想法回到最初,直接采用程序接受,判断结尾字符

   其实我接收的数据都有一个显著的特点,一帧数据结尾都是"\r\n"。为什么我不使用直接字符判断呢?

我一直担心的怕单片机处理不过来,影响了整体性能。所以我实践了一下,直接中断字符接收,一个一个接收。依靠一帧数据的结尾字符'\n'进行分帧处理。实测  1s 20帧 平均一帧长度60,波特率38400 完全没问题,不知道现场使用的情况怎么样,测试了告诉大家。

 

通过以上的经历,我明白了一个道理。什么东西别自己以为,自己觉得怎么样。多靠自己去实际做,实际测试。