欧美极品高清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