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