单片机串口数据处理(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在此期间无法处理其他任务,实时性收到严重影响。

发布了8 篇原创文章 · 获赞 18 · 访问量 5234

猜你喜欢

转载自blog.csdn.net/QDchenxr/article/details/87165881