STM32串口發送第一個字符丟失解決之道


stm32用printf函數重定向到串口USART1發現第一個字符沒打印出來具體如下:

剛開始修改fputc函數如下:

int fputc(int ch,FILE *f)
{
USART_SendData(USART1,(uint8_t)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
return(ch);
}

然后其他外設配置好之后直接使用printf(“abc");發現a打印不出來,具體原因為stm32的usart的sr寄存器的TC為初始為1,導致第一次while時的第一個數據被覆蓋,所以打印不出;

具體改進方法:

1.直接修改while的等待條件,while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);把TC改為TXE,因為TXE只能硬件清零,在數據寫進DR時就置0,數據移出時置1,可以保證數據不會在DR被覆蓋;

2.既然TC位初始為1導致的問題,那么我們在發送每一個字節前把TC置0也可以解決問題,

寫多一句USART_ClearFlag(UART4, USART_FLAG_TC);

3.條件允許情況下,也可以委屈自己一下,在輸出字符前面加一沒用字符,也可以解決;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM