2、串口實驗

1、串口通信:也就是常說RS232通信,通信主要由三根線完成

                          構成:地線、接收數據線RX、發送數據線TX

                          通信方式:異步,也就是可以同時發送與接收

                          配置方式:通信中重要的參數是波特率、數據位、停止位和奇偶校驗位,對於兩個進行通訊的串口,這些參數必須匹配。

                          距離:通訊距離較短,一般不超過15m。

         在本實驗中主要測試開發板的接收功能。主要的設計思路就是當串口接收到一幀完整的數據幀時,通過設置相應的標誌位,使得串口中斷使能。對接收的數據做出是否接收完成的判斷,如果完成,則打印出你接收到的數據。那麼現在來分析下它是怎麼實現數據的接收的。

        開始接收數據前,我們應該告訴串口要開始工作了,於是我們就分析出給串口發送一個固定的序列:1110x0x0x0000,在接收信號的下降沿到來之後,每3位裏至少有兩位

的0,則說明這是開始接收數據的信號。


     它的數據格式如下圖所示:校驗位與停止位可以依據軟件設定。


      我們使能了串口中斷,且開啓了串口的校驗中斷PE(Parity error )中斷以及接收緩衝區非空中斷使能,這樣我們就可以進入到我們的中斷使能函數。

教材通信協議詳解代碼:當接收到從電腦發過來的數據,把接收到的數據保存在 USART_RX_BUF 中,同時在接收狀態寄存器(USART_RX_STA)中計數接收到的有效數據個數,當收到回車(回車的表示由 2 個字節組成:0X0D 和 0X0A)的第一個字節 0X0D 時,計數器將不再增加,等待0X0A 的到來,而如果 0X0A 沒有來到,則認爲這次接收失敗,重新開始下一次接收。如果順利接收到 0X0A,則標記 USART_RX_STA 的第 15 位,這樣完成一次接收,並等待該位被其他程序清除,從而開始下一次的接收,而如果遲遲沒有收到 0X0D,那麼在接收數據超過 USART_REC_LEN 的時候,則會丟棄前面的數據,重新接收。

void USART1_IRQHandler(void)
{
u8 res;        //定義一個unchar類型的變量  8位  相對應於數據結構是8位
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定義了,說明使用ucosII了.
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;  //如果接收到0x0d則將寄存器相應位置1;退出中斷
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收  
}  
}
}       
}

解釋:串口接收到數據,觸發中斷,進入到中斷處理函數,先將接收到的數據保存在寄存器中,然後對接收到的數據進行分析,如果還沒有完成數據的接收,但是已經接收到了0x0d,則判斷這一位是不是0x0a,如果不是那麼則說明接收的數據錯誤,將接收到的數據個數清零,重新開始取得。如果是0x0a位則說明已經完成了數據的接收,將據接收的標誌位置1。如果沒有接收到0x0d,那麼剛接收到的數據位如果是0x0d,則將相應的標誌位置1;如果接收的數據不是0x0a,那麼說明現在接收的數據是正常的數據位。將讀取的數據的個數增加。同時判斷是否超過可接收的數據長度,如果超過最長的長度,則將清零數據個數。

                          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章