最近使用printf发送串口消息时,发现复位之后发送的第一个字节总是消失不见:
printf("12345\r\n"); delay_ms(100);
printf("12345\r\n"); delay_ms(100);
printf("12345\r\n"); delay_ms(100);
结果如下,少了第一个字节:
通过printf发送串口消息的代码如下:
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
return ch;
}
查看数据手册:
发现stm32复位之后,发送完成的标志位TC为1,而通过我们发送数据的代码发现我们发送数据的时候是需要在while循环中等待TC位置1才能继续。
所以说,我们复位之后,TC = 1,然后我们开始发送第一个数据时,根本没有在while循环中等待发送完成,直接跳过去了,所以造成了第一个字节的丢失。
解决办法也很简单,在发送数据前,调用USART_ClearFlag(USART1, USART_FLAG_TC),把TC位清除就行:
int fputc(int ch, FILE *f)
{
USART_ClearFlag(USART1, USART_FLAG_TC);// 解决第一个字节丢失问题
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
return ch;
}
测试结果:
成功解决。
参考连接:https://blog.csdn.net/Backspace110/article/details/52737441