STM32串口在首次发送字符的时候,首字符丢失解决办法
轉(zhuǎn)載文章鏈接:https://blog.csdn.net/w282529350/article/details/9025069
?
網(wǎng)上關(guān)于發(fā)送字符的代碼大多如下:
USART_SendData(USART1,?(uint8_t)ch);
while(?USART_GetFlagStatus(USART1,?USART_FLAG_TC)?!=?SET);
其實(shí)咋一看是說的通的,但是在仔細(xì)看手冊的時候發(fā)現(xiàn)?TC?和?TXE?標(biāo)志位在復(fù)位的時候被置1?,這樣第一次while循環(huán)就是沒有用的。這樣導(dǎo)致了首次第一個字符還沒有被輸出,就被后面的字符覆蓋掉,造成實(shí)際看到的丟失現(xiàn)象。解決辦法就很簡單:在前面加上一句?USART1->SR;
具體代碼如下:
USART1->SR;
USART_SendData(USART1,?(uint8_t)ch);
while(?USART_GetFlagStatus(USART1,?USART_FLAG_TC)?!=?SET);
下面我來說說原因:?第一句讀取SR寄存器,第二句寫DR寄存器?剛好清除了TC標(biāo)志位?。第一次while循環(huán)就起作用了。
?
我在使用庫函數(shù)中的printf函數(shù)時,添加的fputc函數(shù)。
int?fputc(int?ch,?FILE?*f)
{???
/*?TC?TXE?標(biāo)志位在復(fù)位的時候被置1?*/
/*第一句讀取SR寄存器,第二句寫DR寄存器*/
/*?如果不這樣操作,首次發(fā)送的第一個字符會丟失?*/
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)
總結(jié)
以上是生活随笔為你收集整理的STM32串口在首次发送字符的时候,首字符丢失解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拦截器原理多个拦截器执行顺序
- 下一篇: php通过ajax下载文件,通过Ajax