串口接收時丟數據問題解決方案

老規矩,先說下問題:串口在接收pc端發來的數據時(100個bytes,每200ms發送一次),偶爾會丟一些數據。某一次的測試記錄如下:

第一次丟數據 發送總量60多萬字節 丟了27個
第二次丟數據 發送總量80多萬字節 (在上一次發送的基礎上又)丟了40個
第三次丟數據 發送總量190多萬字節 (在上一次發送的基礎上又)丟了37個
 
      以上數據要說明的是所丟的數據是一個隨機情況,因爲如果我把環境清空(例如斷電重啓)而pc端的發送條件不變,那麼丟數據的情況就不是上面顯示的記錄了。
 
      分析,所謂的丟數據無非就是fifo溢出軟件來不及讀取或者是軟件緩衝區的可讀區大小爲0。不過從上述情況來看應該不是後者的原因。因爲,如果是後者,當pc發送條件不變而開發板環境清空重來的話,丟數據的情況應該一樣。
 
       針對以上情況,可通過以下幾個方案來修改
       方案一:如果pc(發送端)有自動流控,那麼ce端也應該打開自動流控--在串口驅動中通過rUMCON寄存器設置;如果pc端沒有,ce端也應該將自動流控關閉
       方案二:提高接收線程的優先級,包括應用程序和驅動程序的
       方案三:設置串口控制器的接收中斷模式和FIFO的trigger level值。中斷模式有兩種,pulse模式的意思是當FIFO中的數據量剛到達所要求(trigger level)的時候會產生中斷,該中斷只在那一刻產生,如果那時cpu還在處理上一次的中斷而把該中斷mask掉,那麼該中斷就回被丟掉,而FIFO中的數據就會一直增加到溢出;level模式的意思是隻要FIFO中的數據達到所要求的時候就會產生中斷,包括比所要求的多的時候,只要cpu在FIFO中的數據在溢出之前處理完上一次的中斷而來處理這次中斷,這樣FIFO就不會溢出,數據也就不會丟失。
本文出自 “bluefish” 博客,請務必保留此出處http://bluefish.blog.51cto.com/214870/65389

本文出自 51CTO.COM技術博客

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/gooogleman/archive/2009/07/18/4359624.aspx

發佈了18 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章