STM32庫函數void USART_SendData()的缺陷和解決方法
使用USART_SendData()函數非連續發送單個字符是沒有問題的;當連續發送字符時(兩個字符間沒有延時),就會發現發送緩沖區有溢出現象。若發送的數據量很小時,此時串口發送的只是最后一個字符,當發送數據量大時,就會導致發送的數據莫名其妙的丟失。
本文引用地址:http://cqxgywz.com/article/201611/322909.htm如:
2
此API函數不完善,函數體內部沒有一個判斷一個字符是否發送完畢的語句,而是把數據直接放入發送緩沖區,當連續發送數據時,由于發送移位寄存器的速度限制(與通信波特率有關),導致發送緩沖區的數據溢出,老的數據還未及時發送出去,新的數據又把發送緩沖區的老數據覆蓋了。
3
方案1.加入延時函數(下下策),不需要修改USART_SendData()函數
}
方案2.修改USART_SendData()函數,在其內部加入發送緩沖區的USART_FLAG_TXE狀態檢測語句,確保一個字符完全發送出去,才進行下一個字符的發送。
實現方法:每發送一個字符都檢測狀態寄存器,確保數據已經發送完畢。具體操作步驟如下所示。
修改前的函數定義體
void USART_SendData(USART_TypeDef* USARTx, u16 Data)
{
}
修改后的函數定義體
void USART_SendData(USART_TypeDef* USARTx, u16 Data)
{
}
方案3.
USART_SendData(USART1, RxBuffer[TxCounter]);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待發送緩沖區空才能發送下一個字符
ST這么做的原因是:使用發送中斷功能。


評論