STM32串口在首次发送字符的时候,首字符丢失解决办法

转载文章链接:https://blog.csdn.net/w282529350/article/details/9025069

 

网上关于发送字符的代码大多如下:

USART_SendData(USART1, (uint8_t)ch);
while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);

其实咋一看是说的通的,但是在仔细看手册的时候发现 TC 和 TXE 标志位在复位的时候被置1 ,这样第一次while循环就是没有用的。这样导致了首次第一个字符还没有被输出,就被后面的字符覆盖掉,造成实际看到的丢失现象。解决办法就很简单:在前面加上一句 USART1->SR;

具体代码如下:

USART1->SR;
USART_SendData(USART1, (uint8_t)ch);
while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);

下面我来说说原因: 第一句读取SR寄存器,第二句写DR寄存器 刚好清除了TC标志位 。第一次while循环就起作用了。

 

我在使用库函数中的printf函数时,添加的fputc函数。

int fputc(int ch, FILE *f)
{   
/* TC TXE 标志位在复位的时候被置1 */
/*第一句读取SR寄存器,第二句写DR寄存器*/
/* 如果不这样操作,首次发送的第一个字符会丢失 */
USART1->SR;
USART_SendData(USART1, (uint8_t)ch);
while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
return (ch);
}

 

也可将USART1->SR;替换为USART_GetFlagStatus(USART1, USART_FLAG_TC)

你可能感兴趣的:(STM32)