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串口在首次发送字符的时候,首字符丢失解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拦截器原理多个拦截器执行顺序
- 下一篇: Unity3D的一些坑