單片機模塊化程序: 來看看加入環形隊列的串口發送數據


 

 一,為什么要使用環形隊列來發送數據?是為了解決什么問題呢!

 

 

 

 

這節說了怎么用中斷發送數據,但是大家是否想過,這種中斷發送有個bug,看一下下面的

 

 

 

 

 

 

看到了沒 本來想讓他回復

qwertyuioaqwertyuioa   而回復的是  qqwertyuioa

 

其實bug顯而易見,由於發送不再占用主循環,所以下一條指令會立即發送!那么就把第一條沖掉了

 

 

 

現在的想法是需要有個緩存,我不停的往緩存里面寫數據,串口發送中斷不停的從緩存里面取出來,然后發出去!

直接利用環形隊列是很好的選擇.

我把發送的數據寫入環形隊列,然后打開串口發送中斷

串口發送中斷里面判斷環形隊列里面的數據個數是不是大於0,如果是就讀出來發出去!

 

二,定義一些變量

 

 

 

 

 

 

 

 

 

 

 

三,然后把數組交給 環形隊列變量去管理

 

 

 

四,串口發送中斷里面就是這樣

 

五,修改一下環形隊列的一個函數,填充完數據就打開中斷

 

 

 

六,現在測試

 

 

 

 

 

 

 

現在的數據不會出現丟失!

 

注意:即使是使用了環形隊列也不要在主循環里面

 

 

 

 

 環形隊列緩存也有限! 只要波特率定好了,中斷發送每一位數據的時間是一定的,發送數據就一定需要時間!

現在是直接造成死機,

 

 

 

其實造成死機的原因是因為環形隊列里面使用的printf,

 

 

 而printf 並不是中斷發送,造成了沖突

 

 

 

改一下

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM