STM32使用串口发送数据 复位后第一次发送的数据中第一个数据丢失之原因

问题描述:

使用STM32F103芯片,通过串口USART1发送数据,复位之后,第一次发送数据时,所发送的数据中第一个数据丢失,之后发送的数据正常。代码是从正点原子STM32F1例程中扒出来的,接收和发送同时使用时,是正常的,只有单独使用发送时,存在上述现象。

相应代码:

u8 TEST0_BUF[] = {0XC0,0XF9,0XA4,0xB0,0X99,0X92,0X82,0XF8,0X80,0X90};
 
if(key==KEY0_PRES)
{    
    delay_ms(10);
    if(key==KEY0_PRES)
    {                       
        le=10;
        for(t=0;t<le;t++)
        {
            USART_SendData(USART1, TEST0_BUF[t]);
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        }
    }    
}

复位后,第一次按下按键KEY0,发送的数据为:

F9 A4 B0 99 92 82 F8 80 90 
第二次按下按键KEY0,发送的数据为:

F9 A4 B0 99 92 82 F8 80 90 C0 F9 A4 B0 99 92 82 F8 80 90 
由此可见,第一次发送的数据中少了C0,之后发送的数据正常。

添加发送和接收代码进行测试:

u8 TEST0_BUF[] = {0XC0,0XF9,0XA4,0xB0,0X99,0X92,0X82,0XF8,0X80,0X90};
 
if(key==WKUP_PRES)
{    
    delay_ms(10);            
    if(USART_RX_STA&0x8000 && key==WKUP_PRES)
    {                       
        len = USART_RX_STA&0x3fff;
        for(t=0;t<len;t++)
        {
            USART_SendData(USART1, USART_RX_BUF[t]);
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        }
        USART_RX_STA=0;
    }                
}
 
if(key==KEY0_PRES)
{    
    delay_ms(10);
    if(key==KEY0_PRES)
    {                       
        le=10;
        for(t=0;t<le;t++)
        {
            USART_SendData(USART1, TEST0_BUF[t]);
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        }
    }    
}
此时,复位后使用串口调试助手发送数据,按下WKUP键,再将数据发回到串口调试助手,数据正常,未出现发送的数据第一位缺少情况;继续按下KEY0也是C0~90数据,正常。若复位后直接按KEY0,第一次发送的数据仍然缺少C0,之后正常。

解决办法:
在发送数据的语句前加上:

USART_ClearFlag(USART1,USART_FLAG_TC);
清除 发送完成标志位 USART_FLAG_TC

测试代码如下:

u8 TEST0_BUF[] = {0XC0,0XF9,0XA4,0xB0,0X99,0X92,0X82,0XF8,0X80,0X90};
 
while(1)
{
  key=KEY_Scan(0);
    
    if(key==WKUP_PRES)
    {    
        delay_ms(10);            
        if(USART_RX_STA&0x8000 && key==WKUP_PRES)
        {                       
            len = USART_RX_STA&0x3fff;
            for(t=0;t<len;t++)
            {
                USART_SendData(USART1, USART_RX_BUF[t]);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
            }
            USART_RX_STA=0;
        }                
    }
    if(key==KEY1_PRES)
    {    
        delay_ms(10);
        if(key==KEY1_PRES)
        {                       
            le=10;
            for(t=0;t<le;t++)
            {
                USART_ClearFlag(USART1,USART_FLAG_TC);
                USART_SendData(USART1, TEST0_BUF[t]);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
            }
        }    
    }
    if(key==KEY0_PRES)
    {    
        delay_ms(10);
        if(key==KEY0_PRES)
        {                       
            le=10;
            for(t=0;t<le;t++)
            {
                USART_SendData(USART1, TEST0_BUF[t]);
                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
            }
        }    
    }
}
对比复位后,先按下KEY0和先按下KEY1,即可发现 ,添加清除 发送完成标志位语句后,正常。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值