原先发送语句
for(t=0;t<len;t++)
{
USART_SendData(USART2, USART2_RX_BUF[t]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}
乍一看好像没什么问题,但是可以注意到这里while循环是等待USART_FLAG_TC被清0, 但TC 和 TXE 标志位在复位的时候被置1,因此第一个字符发送时while循环就是没有用的,直接跳过去了。这样导致了首次第一个字符还没有被输出,就被后面的字符覆盖掉了。
2.解决办法
这是因为TC标志位的清0过程是:先读取SR寄存器的值,再向DR寄存器写入数据;
而TXE标志位只需要向DR寄存器写入数据就可以被清0。
所以最终有效代码:
for(t=0;t<sizeof(buff);t++)
{
USART2->SR;//TC 和 TXE 标志位在复位的时候被置1,会导致发送第一个字节丢失,添加这句
USART_SendData(USART2, buff[t]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}
3.参考博主:https://blog.csdn.net/WCP1929779753/article/details/128581697