? ? ? 串口在持續接收數據時容易發生數據黏包(先接收的數據尚未被處理,后面的數據已經將內存覆蓋)的情況,循環緩沖區的本質就是將串口接受到的數據馬上拷貝到另外一塊內存之中。為了避免新來的數據覆蓋掉尚未處理的數據,一方面緩沖區的長度需要有一定的冗余,另外一方面需要引入寫索引(寫指針)始終指向未寫數據區域的開頭。
? ? ? 當一包數據發生溢出的時候,也可以被切割為兩部分,一部分寫在緩沖區最后,另外一部分寫在緩沖區開頭。
? ? ? ? 與此同時,為了防止寫入buffer的新數據把尚未處理的舊數據覆蓋掉,我們還需要引入讀索引的機制,讓其指向正在解析的數據的開頭。CPU解析完成一幀數據之后再讓readIndex指向下一幀需要解析的數據。
? ? ? ?綜上,當新數據到來之時,我們就需要判斷writeIndex和readIndex之間的空閑區域是否能裝下新的數據,如果裝不下,就只能拋棄這一幀數據。出現這種情況后,我們就需要調整這三個參數:(增大)緩沖區大小、(減慢)發送方發送速度、(加快)數據處理速度。
循環緩沖區算法示意圖:
? ? ? 注意,readIndex(讀指針)除了防止未處理的數據被覆蓋之外,還可以用來尋找完整的數據包,用來破解拆包、粘包以及壞包問題。
? ? ? 假定數據幀通過以下數據格式發送,包頭為0xAA代表一幀數據包的開始,隨后是一字節的數據包長度,然后是一定長度的數據,最后一位則是校驗和(計算方式是將前面所有位相加取最后一字節數據)。
IOC文件準備:
①開啟調試接口與外部時鐘晶振,設置時鐘主頻為72Mhz。
?②使能串口2的全局中斷。
③在Core和Src文件目錄下分別新建command.c與command.h文件
? ??