串列埠接收時丟資料問題解決方案
阿新 • • 發佈:2018-11-15
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
老規矩,先說下問題:串列埠在接收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