STM32-串口實驗學習筆記
當串口1發生了相應的中斷,就會跳到改函數執行。這里設計了一個小小的接收協議(系統并未定義):通過這個函數,配合一個數組USART_RX_BUF[ ],一個接收狀態寄存器USART_RX_STA實現對串口的數據的接收管理。USART_RX_BUF[ ]最大值為64,也就是一次接收的數據最大不能超過64字節。USART_RX_STA是一個接收狀態寄存器,其各位的定義如表所示:
本文引用地址:http://www.104case.com/article/201611/320442.htm
(注意:這個是作者設計的協議,怎樣判斷串口接收一組數據完畢?由于每次接收的數據長度不一樣,少的就3個8位數據,多的時候有十多個,這個數據個數是不定的,且沒規律的數據,有什么好的方法讓它接收完整?
協議的設計思路如下:
當接收到從電腦發過來的數據,把接收到的數據保存在 USART_RX_BUF 中,同時在接收狀態寄存器(USART_RX_STA)中計數接收到的有效數據個數,當收到回車(0X0D,0X0A)的第一個字節 0X0D時,標志位即第六位置1,計數器將不再增加,等待 0X0A的到來,而如果 0X0A 沒有來到,則認為這次接收失敗,重新開始下一次接收。如果順利接收到 0X0A,則標記 USART_RX_STA的第七位,這樣完成一次接收,并等待該位被其他程序清除,從而開始下一次的接收,而如果遲遲沒有收到 0X0D,那么在接收數據超過 64 個了,則會丟棄前面的數據,重新接收。由于這個寄存器是作者定義,我們理解時可能容易迷糊,其實這個跟普通寄存器類似,只不過是作者定義了一個8位數,規定了它每位的定義,前兩位是兩個個標志位,后六位用來計數,這樣就好理解了。函數代碼如下:
[cpp]view plaincopy


- voidUSART1_IRQHandler(void)
- {
- u8res;
- if(USART1->SR&(1<<5))//接收到數據USART1應該是作者定義的一個結構體,內含各個寄存器
- {
- res=USART1->DR;
- if((USART_RX_STA&0x80)==0)//接收未完成
- {
- if(USART_RX_STA&0x40)//接收到了0x0d
- {
- if(res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
- elseUSART_RX_STA|=0x80;//接收完成了
- }else//還沒收到0X0D
- {
- if(res==0x0d)USART_RX_STA|=0x40;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3F]=res;
- USART_RX_STA++;
- if(USART_RX_STA>63)USART_RX_STA=0;//接收數據錯誤,重新開始接收
- }
- }
- }
- }
- }
其實我們可以不用協議法
評論