在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32-串口實(shí)驗(yàn)學(xué)習(xí)筆記

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

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

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

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

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

            協(xié)議的設(shè)計(jì)思路如下:

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

            [cpp]view plaincopy
            1. voidUSART1_IRQHandler(void)
            2. {
            3. u8res;
            4. if(USART1->SR&(1<<5))//接收到數(shù)據(jù)USART1應(yīng)該是作者定義的一個(gè)結(jié)構(gòu)體,內(nèi)含各個(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;//接收錯(cuò)誤,重新開(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;//接收數(shù)據(jù)錯(cuò)誤,重新開(kāi)始接收
            21. }
            22. }
            23. }
            24. }
            25. }

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



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉