一,為什么要使用環形隊列來發送數據?是為了解決什么問題呢!
這節說了怎么用中斷發送數據,但是大家是否想過,這種中斷發送有個bug,看一下下面的
看到了沒 本來想讓他回復
qwertyuioaqwertyuioa 而回復的是 qqwertyuioa
其實bug顯而易見,由於發送不再占用主循環,所以下一條指令會立即發送!那么就把第一條沖掉了
現在的想法是需要有個緩存,我不停的往緩存里面寫數據,串口發送中斷不停的從緩存里面取出來,然后發出去!
直接利用環形隊列是很好的選擇.
我把發送的數據寫入環形隊列,然后打開串口發送中斷
串口發送中斷里面判斷環形隊列里面的數據個數是不是大於0,如果是就讀出來發出去!
二,定義一些變量
三,然后把數組交給 環形隊列變量去管理
四,串口發送中斷里面就是這樣
五,修改一下環形隊列的一個函數,填充完數據就打開中斷
六,現在測試
現在的數據不會出現丟失!
注意:即使是使用了環形隊列也不要在主循環里面
環形隊列緩存也有限! 只要波特率定好了,中斷發送每一位數據的時間是一定的,發送數據就一定需要時間!
現在是直接造成死機,
其實造成死機的原因是因為環形隊列里面使用的printf,
而printf 並不是中斷發送,造成了沖突
改一下