功能需求:
1迪文屏顯示數據
2接收迪文屏上的按鍵指令
3讀取迪文屏上的數據
4采用串口方式
問題:
1中斷死機
2無法正確接收迪文屏的按鍵和數據
解決辦法:
1死機:
串口中斷響應函數中增加
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{
USART_ClearFlag(USART1, USART_FLAG_ORE);
}
用於清除標志位
原因是:串口在接收數據過多時,會出現串口溢出錯誤,並進入溢出中斷(ORE中斷)
詳細情況參考這兩位博主的博客,講的很詳細,第一位博主還指出了文檔的翻譯錯誤。
雖然我不是參考這兩位博主的資料,但還是記錄一下,方便以后學習研究
https://blog.csdn.net/love_maomao/article/details/8234039
https://blog.csdn.net/qq_34401994/article/details/76359581
為什么串口接收數據過多,就是下面要講的一個問題。
2無法接收按鍵指令和數據
把顯示數據的發送條件進行修改,一開始是循環一次發一次數據,修改之后的方案是只有數據發生實質性的變化之后才發送給液晶屏
原因是:向迪文液晶屏發送數據的時候,液晶屏會自動回傳一組指令,由於大循環的時間間隔很短,那么單片機的串口就一直有數據在接收,導致上面的溢出錯誤,雖然通過清除標志位的方式解決死機問題,但是按鍵指令和讀取數據之后的回傳指令已經被大量的無用回傳指令(即向液晶屏發送指令,液晶屏的回傳指令)給淹沒掉了,那么出現這種問題也就不意外了
進階:按照上面的方案修改軟件之后,按鍵的指令也是時靈時不靈,一開始以為是循環時間間隔長了,導致延遲,仔細分析之后發現不是這個原因,因為就算間隔時間長,那么也是響應慢,但是不會不響應,肯定是其它原因造成。繼續邊調試邊分析程序執行的過程,原因找到了。接收到無用指令后,如果此時按鍵也跟着發指令,那么兩種指令就混合在一起,這時候按鍵就不靈,如果兩種指令分開了,那么這時候按鍵指令就有效了,為了避免此種情況,直接把無用指令給屏蔽掉,這樣,單片機就只接收有效指令,經過測試,該問題也解決了。
總結:
1不能因為項目小就亂寫程序,還是按照正常的框架結構進行設計
2調試的時候不能光看結果,還需要去分析程序執行的過程,不可以沒有根據的瞎猜瞎想
3對於調試時候view的數據結果要分析原因
4標志位的使用一定要盡量全的分析可能性,還要保證所有的可能性能循環起來