<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32-串口實(shí)驗學(xué)習筆記

STM32-串口實(shí)驗學(xué)習筆記

作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò ) 收藏
USART1_IRQHandler(void)函數:

當串口1發(fā)生了相應的中斷,就會(huì )跳到改函數執行。這里設計了一個(gè)小小的接收協(xié)議(系統并未定義):通過(guò)這個(gè)函數,配合一個(gè)數組USART_RX_BUF[ ],一個(gè)接收狀態(tài)寄存器USART_RX_STA實(shí)現對串口的數據的接收管理。USART_RX_BUF[ ]最大值為64,也就是一次接收的數據最大不能超過(guò)64字節。USART_RX_STA是一個(gè)接收狀態(tài)寄存器,其各位的定義如表所示:

本文引用地址:http://dyxdggzs.com/article/201611/320442.htm

(注意:這個(gè)是作者設計的協(xié)議,怎樣判斷串口接收一組數據完畢?由于每次接收的數據長(cháng)度不一樣,少的就3個(gè)8位數據,多的時(shí)候有十多個(gè),這個(gè)數據個(gè)數是不定的,且沒(méi)規律的數據,有什么好的方法讓它接收完整?

協(xié)議的設計思路如下:

當接收到從電腦發(fā)過(guò)來(lái)的數據,把接收到的數據保存在 USART_RX_BUF 中,同時(shí)在接收狀態(tài)寄存器(USART_RX_STA)中計數接收到的有效數據個(gè)數,當收到回車(chē)(0X0D,0X0A)的第一個(gè)字節 0X0D時(shí),標志位即第六位置1,計數器將不再增加,等待 0X0A的到來(lái),而如果 0X0A 沒(méi)有來(lái)到,則認為這次接收失敗,重新開(kāi)始下一次接收。如果順利接收到 0X0A,則標記 USART_RX_STA的第七位,這樣完成一次接收,并等待該位被其他程序清除,從而開(kāi)始下一次的接收,而如果遲遲沒(méi)有收到 0X0D,那么在接收數據超過(guò) 64 個(gè)了,則會(huì )丟棄前面的數據,重新接收。由于這個(gè)寄存器是作者定義,我們理解時(shí)可能容易迷糊,其實(shí)這個(gè)跟普通寄存器類(lèi)似,只不過(guò)是作者定義了一個(gè)8位數,規定了它每位的定義,前兩位是兩個(gè)個(gè)標志位,后六位用來(lái)計數,這樣就好理解了。函數代碼如下:

[cpp]view plaincopy
  1. voidUSART1_IRQHandler(void)
  2. {
  3. u8res;
  4. if(USART1->SR&(1<<5))//接收到數據USART1應該是作者定義的一個(gè)結構體,內含各個(gè)寄存器
  5. {
  6. res=USART1->DR;
  7. if((USART_RX_STA&0x80)==0)//接收未完成
  8. {
  9. if(USART_RX_STA&0x40)//接收到了0x0d
  10. {
  11. if(res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開(kāi)始
  12. elseUSART_RX_STA|=0x80;//接收完成了
  13. }else//還沒(méi)收到0X0D
  14. {
  15. if(res==0x0d)USART_RX_STA|=0x40;
  16. else
  17. {
  18. USART_RX_BUF[USART_RX_STA&0X3F]=res;
  19. USART_RX_STA++;
  20. if(USART_RX_STA>63)USART_RX_STA=0;//接收數據錯誤,重新開(kāi)始接收
  21. }
  22. }
  23. }
  24. }
  25. }

其實(shí)我們可以不用協(xié)議法



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>