关于单片机串口的两种发送状态

实时性在嵌入式开发中的非常重要,优化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在此期间无法处理其他任务,实时性收到严重影响。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值