**
說出來都是淚,折騰了乙個星期的串列埠接收並處理的程式,結果還經常出現資料丟失現象,結果是被老大罵了一頓,然後人家半天時就給搞定。除了恨自己無能以外,只有好好向高手學習。現在把人家的資料處理思路寫出來,一塊學習,一塊成長。
閒話不多說,說說學到的東西吧。
這裡主要介紹思路,適合所有的微控制器,就以stc的15微控制器的平台進行解說
步驟一:串列埠的資料接收
關於串列埠的配置,和基礎性的就不多說,自行看資料手冊。直接看串列埠中斷
「` void uart1() interrupt 4 using 1 }
if (ti) }
在串列埠的中斷裡,只做接收,任何判斷都不做,防止因為判斷的方式不對,把一幀資料都給扔掉。就造成資料丟失。先不管三七二十一,先全盤接收。
步驟二:判斷資料是否接收完成
if(rx1_len >0)
}else
if(usart1_rx_progress_datelength ==0)
}
大體思路介紹,串列埠接收到乙個位元組的資料,在定時器的中斷裡進行掃瞄,
在一幀資料還沒完全接收完成,每次的定時器中斷掃瞄到的rx1_len都會+1,所以函式都會進入到
else if (usart1_rx_lastdatelength == rx1_len)裡 當一幀資料接收完成後,每次掃瞄的結果就是
usart1_rx_lastdatelength == rx1_len 所以函式就會進入到
if(usart1_rx_lastdatelength == rx1_len)
}
先說下判斷一幀資料接收完成的依據是在本次掃瞄串列埠接收資料個數與上次掃瞄個數一樣,並且在10ms裡都是這樣,(這裡可以根據自己實際情況而定)
一幀資料接收完成後進行複製,做處理,防止因為資料間隔時間過短而造成資料處理紊亂,或者資料丟失
資料接收完成,並且備份後,可以在主迴圈裡進行處理。
步驟三 資料的甄別與處理
在主迴圈裡進行資料的甄別與處理,這裡的思路就直接在**裡寫吧。為了更具有適配性,就用偽**說明
if (usart1_rx_progress_datelength>0)
else
// 在接收到資料的陣列裡一一的進行掃面,不是的就扔掉。(針對於特殊標誌在幀頭,其他情況自行改動)
}usart1_rx_progress_datelength =0;
datelength=0;
}
到此,大體的思路介紹完了
(剛開始部落格生涯,編輯格式上可能處理的不太好,先將就吧)
微控制器(一)51微控制器串列埠接收 傳送通訊
這次做課設整體不太順利,因為學校的開發板真的是 一言難盡 這裡就選擇性的分享一點 方面,有據可循,不那麼玄學的問題。只要開了中斷,一點要寫中斷函式,可以是 void timer0 interrupt 4 可以是這樣,先放乙個空函式,不會有什麼玄學問題 不信,嘿嘿?你試試 這是個串列埠收發暫存器,教科...
無串列埠空閒中斷微控制器串列埠接收未知長度位元組方法
之前寫過一篇stm32串列埠dma收發未知長度的博文。這次說一下如何在沒有空閒中斷的情況下實現未知長度的讀取。思路 在串列埠接收的時候,例串列埠設定 9600波特率 8個資料位 1個停止位 無校驗。9600波特率表示,每秒傳輸9600個位,即每秒傳輸9600 8位資料位 1位停止 1066位元組,那...
微控制器串列埠 佇列的使用
最近做微控制器開發經常遇見要用串列埠接收資料的情況,實際專案中肯定不能當串列埠接收中斷一來就去處理,於是我們可以用到佇列這個資料結構來儲存上一幀資料,想用的時候取出即可。新建佇列結構體 define buffer max 20 佇列緩衝區大小,根據實際情況來定 typedef struct uart...