野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18059|回复: 1

关于串口通讯发送数据后等待发送数据寄存器置一的问题

[复制链接]
发表于 2019-5-27 15:58:26 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]/* 发送一个字节 */
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
        USART_SendData(pUSARTx, data);
       
        /*发送一个字节字节后判断数据发送寄存器是否为空,如果不判断,
        *只发送一个字节没有任何影响,但发送多个字节会导致最后一个发送的字节之前数据被吞。*/
        while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );
}[/mw_shl_code]


[mw_shl_code=c,true]// 串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{
  uint8_t ucTemp;
        if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
        {               
                ucTemp = USART_ReceiveData(DEBUG_USARTx);
    USART_SendData(DEBUG_USARTx,ucTemp);
//教程上没有下面这句,跟从32发送字节到串口不同,没有下面这句也不会吞数据,有的话也不影响。而发送字节必须有下面这句。
                while( USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET );
        }         
}[/mw_shl_code]


为什么连续发送数据时不等待寄存器TXE位置一会导致吞数据?
为什么重写的中断服务函数不用等待TXE位置一?
回复

使用道具 举报

发表于 2019-5-28 09:31:40 | 显示全部楼层
TXE意思  发送寄存器为空,不等的话还没发完又覆写了发送寄存器,从电路上发送一位一位的时间相比指令执行慢很多

例程中上面这样写收一个就发一个只是个简单例子,不是最健壮的写法,你可以看下环形队列那个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2026-1-28 16:44 , Processed in 0.042439 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表