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,即可发现 ,添加清除 发送完成标志位语句后,正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值