關於個人對UART+DMA +串口空閒中斷的理解與疑惑

   以下只是個人根據自己實際項目的使用在論壇裏看到的一些交流的理解,歡迎大家指出其中理解錯誤的地方。

1. 我爲什麼選擇了 串口+DMA+空閒中斷模式

  在網上去搜索會看到很多的資料與簡介,甚至還有許多實例程序,這裏我就不在重複介紹。當初我選擇這種模式來進行處理接收串口數據有以下幾個原因。

 1. 實際中我是用串口去接收一種船舶上發出的報文數據(AIS數據),你當成GPS就行了。這種數據會根據周圍的船舶的數量的多少,串口接收數據的頻率也會不同。目前實測 最多的 1S可以接收5幀左右的數據,1幀數據大約在50~100個字符。所以我爲了節約處理器性能採用了這種模式。

 2.純粹是爲了偷懶,覺得采用了這種模式接收,完全可以高枕無憂的接收數據,不用自己去寫什麼接收程序和處理程序。

 3.初次接觸這種模式,覺得真的很牛。過度迷戀。

 2. 實際使用過程中遇到的問題以及處理方法

  1. 一般情況下,這種模式做串口數據接收還是非常的好用,但是這是一般的情況下。下面內容來自論壇的討論:

 

  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:aio@001qvB>4>ke`03wv41P06,0*30

   !AIVDM,1,1,,B,16:bdTQP1;WWeLp@oPM`ugv820Sw,0*30

   其實這個問題也好解決,只要我們再次手動處理一下數據,分割一下即可,實際中我也是這麼做的。但是可能是自己能力不足,又或者是我沒有考慮其他的什麼意外情況,就算我切割後,我解碼數據會偶爾出現亂碼,這也說明了串口數據接收有問題或者是切割有問題。由於這些問題只有在現場才能調試,實際這樣的數據又很少能遇到一次,至今我也沒解決。自己在實驗室模擬完全沒問題。(果然模擬和實際還是差很多的,實際要考慮很多意外的情況,就像上面圖片中看到的說的情況一樣)

  3.目前有想法回到最初,直接採用程序接受,判斷結尾字符

   其實我接收的數據都有一個顯著的特點,一幀數據結尾都是"\r\n"。爲什麼我不使用直接字符判斷呢?

我一直擔心的怕單片機處理不過來,影響了整體性能。所以我實踐了一下,直接中斷字符接收,一個一個接收。依靠一幀數據的結尾字符'\n'進行分幀處理。實測  1s 20幀 平均一幀長度60,波特率38400 完全沒問題,不知道現場使用的情況怎麼樣,測試了告訴大家。

 

通過以上的經歷,我明白了一個道理。什麼東西別自己以爲,自己覺得怎麼樣。多靠自己去實際做,實際測試。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章