欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STM32串口打印存在一些疑問 [打印本頁]

作者: 叫我紅領巾    時間: 2019-9-20 16:09
標題: STM32串口打印存在一些疑問
正在學習原子的例程,存在一些疑問
對于USART_RX_STA bit15和bit14我知道意思,不明白為何在接收到0x0d和接收成功后USART_RX_STA這個變量從0x0000變為0x4000和0x8000,這個通信協議是定義在程序哪個地方?能否修改該通信協議?比如bit0-12作為數據位,bit13作為0x0d,bit14作為0x0a,bit15作為接收成功標志。

STM32單片機源程序如下:
#if EN_USART1_RX   //如果使能了接收
//串口1中斷服務程序
//注意,讀取USARTx->SR能避免莫名其妙的錯誤           
u8 USART_RX_BUF[USART_REC_LEN];     //接收緩沖,最大USART_REC_LEN個字節.
//接收狀態
//bit15,        接收完成標志
//bit14,        接收到0x0d
//bit13~0,        接收到的有效字節數目
u16 USART_RX_STA=0;       //接收狀態標記         
void USART1_IRQHandler(void)
{
        u8 res;        
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
        OSIntEnter();   
#endif
        if(USART1->SR&(1<<5))        //接收到數據
        {         
                res=USART1->DR;
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                if(res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
                                else USART_RX_STA|=0x8000;        //接收完成了
                        }
                        else //還沒收到0X0D
                        {        
                                if(res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收         
                                }                 
                        }
                }                                                                                                
        }
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
        OSIntExit();                                                                                          
#endif
}
#endif               


作者: yzwzfyz    時間: 2019-9-21 08:50
本帖最后由 yzwzfyz 于 2019-9-21 13:46 編輯

串口接收程序不是你寫的,所以你不知道。
猜猜也知道:
1、串行接收服務程序中,會依據地通訊的協議對每一個接收到的字節進行識別處理,包括接收到的開始符、結束符,校驗、字節數等等。
2、收到有效字節后,會放入到指定的緩沖區,以備你使用。
3、另外它還做了一個標記供你適時判斷,它就是:USART_RX_STA!
4、至于 USART_RX_STA = ?,當然由串行接收服務程序決定了,它想讓它是什么它就是什么?,自然它會在恰當的時候讓它= 4000H 或 4000H 了。
如果你自己寫這段串行接收程序,你也同樣能做到這樣!
作者: QTW    時間: 2019-9-24 16:03
USART_RX_STA是自己定義的一個(unsigned short  int)類型的16位狀態標志變量,以第14位(0x4000)標志接收到了0x0d,以第15位(0x8000)標志已經接收0x0a,即規定了只能連續接收到(0x0d、0x0a)則標志一個數據包接收完成了,否則接收錯誤。USART_RX_STA剩余的14位則用來做接收數據包的長度,如果接收數據包不做限制,則最大可接收2的14次方個字節。
你要自己改當然也可以!!!!




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1