久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > STM32庫函數void USART_SendData()的缺陷和解決方法

STM32庫函數void USART_SendData()的缺陷和解決方法

作者: 時間:2016-11-28 來源:網絡 收藏
1問題及現象

使用USART_SendData()函數非連續發送單個字符是沒有問題的;當連續發送字符時(兩個字符間沒有延時),就會發現發送緩沖區有溢出現象。若發送的數據量很小時,此時串口發送的只是最后一個字符,當發送數據量大時,就會導致發送的數據莫名其妙的丟失。

本文引用地址:http://cqxgywz.com/article/201611/322909.htm

如:

for(TxCounter = 0;TxCounter < RxCounter; TxCounter++)

USART_SendData(USART1, RxBuffer[TxCounter]);

2原因

此API函數不完善,函數體內部沒有一個判斷一個字符是否發送完畢的語句,而是把數據直接放入發送緩沖區,當連續發送數據時,由于發送移位寄存器的速度限制(與通信波特率有關),導致發送緩沖區的數據溢出,老的數據還未及時發送出去,新的數據又把發送緩沖區的老數據覆蓋了。

3解決方法(目前總結的兩種方案)

方案1.加入延時函數(下下策),不需要修改USART_SendData()函數

for(TxCounter = 0;TxCounter < RxCounter; TxCounter++){

USART_SendData(USART1, RxBuffer[TxCounter]);

DelayMS(2); //加入一個小的延時

}

方案2.修改USART_SendData()函數,在其內部加入發送緩沖區的USART_FLAG_TXE狀態檢測語句,確保一個字符完全發送出去,才進行下一個字符的發送。

實現方法:每發送一個字符都檢測狀態寄存器,確保數據已經發送完畢。具體操作步驟如下所示。

修改前的函數定義體

void USART_SendData(USART_TypeDef* USARTx, u16 Data)

{

assert_param(IS_USART_ALL_PERIPH(USARTx));

assert_param(IS_USART_DATA(Data));

USARTx->DR = (Data & (u16)0x01FF);

}

修改后的函數定義體

void USART_SendData(USART_TypeDef* USARTx, u16 Data)

{

assert_param(IS_USART_ALL_PERIPH(USARTx));

assert_param(IS_USART_DATA(Data));

USARTx->DR = (Data & (u16)0x01FF);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待發送緩沖區空才能發送下一個字符

}

方案3.不修改原來的庫函數,在每一個字符發送后檢測狀態位。

USART_SendData(USART1, RxBuffer[TxCounter]);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待發送緩沖區空才能發送下一個字符

ST這么做的原因是:使用發送中斷功能。



關鍵詞: STM32庫函數USAR

評論


技術專區

關閉