新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32-串口實驗學習筆記

        STM32-串口實驗學習筆記

        作者: 時間:2016-11-23 來源:網絡 收藏
        USART1_IRQHandler(void)函數:

        當串口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
        1. voidUSART1_IRQHandler(void)
        2. {
        3. u8res;
        4. if(USART1->SR&(1<<5))//接收到數據USART1應該是作者定義的一個結構體,內含各個寄存器
        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;//接收錯誤,重新開始
        12. elseUSART_RX_STA|=0x80;//接收完成了
        13. }else//還沒收到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;//接收數據錯誤,重新開始接收
        21. }
        22. }
        23. }
        24. }
        25. }

        其實我們可以不用協議法



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沈丘县| 德钦县| 东海县| 巴彦淖尔市| 江都市| 阳泉市| 蒲江县| 诸暨市| 库车县| 辉南县| 扶绥县| 伊宁县| 积石山| 漳州市| 汝州市| 定西市| 阜新| 峨山| 崇文区| 棋牌| 白沙| 宜良县| 丽江市| 始兴县| 泰宁县| 乌鲁木齐县| 阿勒泰市| 都江堰市| 封开县| 包头市| 宁强县| 厦门市| 镇巴县| 如东县| 平顶山市| 腾冲县| 大埔区| 右玉县| 肇东市| 孝感市| 崇阳县|