單片機串口數據處理(1)——串口中斷髮送數據

實時性在嵌入式開發中的非常重要,優化MCU串口傳輸處理方式可以提高嵌入式系統的實時性。在互聯網上學習並親自實驗(基於STM32單片機)後,我將分兩次介紹優化MCU串口收發數據的方法,參考資料將在第二篇博客中列出。第一次先介紹串口發送數據的優化。

發送方式一:

方式一採用“死等”的方式發送數據,即在while循環中等待字發送完成標誌位置位。

void usartsend(void)
{
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待上一字節發送完成 
    USART1->DR=txbuf[cnt]; //要發送的字節存入串口數據寄存器 
}

void sendcmd(void)
{
    for(cnt=0;cnt<100;cnt++)//發送100個字節
    {
        usartsend();//調用字節發送函數
    }
}

這種方式在while循環中消耗了大量時間,而且sendcmd函數中一遍遍地調用usartsend函數也比較費時。實驗中我採用的波特率爲115200,理論上發送完100字節數據耗時約8.68ms,而在硬件仿真時的耗時約9.45ms。在這9.54ms內,MCU除了發送字節和while等待外沒有處理其他任務,嚴重影響系統實時性。

發送方式二:

方式二採用中斷的方式發送數據。要發送數據時,使能串口的發送緩衝區空中斷,在ISR中判斷是否有數據要發送,如果有,則將要發送的字節存入串口數據寄存器。當所有數據發送完畢後禁止串口的發送緩衝區空中斷。

void usartsend(void)
{
    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);//使能串口的發送緩衝區空中斷
}

void USART1_IRQHandler(void) //串口1的ISR              
{
    if(USART_GetITStatus(USART1,USART_IT_TXE)==SET)
    {
        USART1->DR=txbuf[cnt];
        cnt++;
        if(cnt>=100)
        {
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//數據發送完畢,禁止串口的發送緩衝區空中斷
        }
    }
} 

這種方式主要是ISR佔用時間。採用115200的波特率實驗時,發送100字節數據用時約8.51ms。用時小於理論時間(8.68ms)的原因可能是最後一個字節沒發送完程序就到了我設的斷點。

第二種方法的用時比第一種方法少。更值得注意的是第二種方法花費的8.51ms是分片的,程序不會死等8.51ms,在此期間MCU可以處理其他任務,系統的實時性高。而第一種方法程序死等9.54ms,MCU在此期間無法處理其他任務,實時性收到嚴重影響。

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