簡介:本文主要談到了STM32庫函數void USART_SendData()存在的一些問題,針對這些問題提到了3個解決方案,一起來看看。
2.1問題及現象
使用USART_SendData()函數非連續發送單個字符是沒有問題的;當連續發送字符時(兩個字符間沒有延時),就會發現發送緩沖區有溢出現象。若發送的數據量很小時,此時串口發送的只是最后一個字符,當發送數據量大時,就會導致發送的數據莫名其妙的丟失。
如:
for(TxCounter = 0;TxCounter < RxCounter; TxCounter++)
USART_SendData(USART1, RxBuffer[TxCounter]);
2.2原因
此API函數不完善,函數體內部沒有一個判斷一個字符是否發送完畢的語句,而是把數據直接放入發送緩沖區,當連續發送數據時,由于發送移位寄存器的速度限制(與通信波特率有關),導致發送緩沖區的數據溢出,老的數據還未及時發送出去,新的數據又把發送緩沖區的老數據覆蓋了。
2.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)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_DATA(Data));
/* Transmit Data */
USARTx->DR = (Data & (u16)0x01FF);
}
修改后的函數定義體
void USART_SendData(USART_TypeDef* USARTx, u16 Data)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_DATA(Data))
/* Transmit 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單片機的DLP驅動電路研究
下一篇:最后一頁
推薦閱讀
史海拾趣
在電子行業,技術創新是企業持續發展的關鍵。常州星海電子一直致力于技術的研發和創新。近年來,公司成功取得了一項名為“一種高反壓二極管”的專利,通過采用先進的生產工藝和設計,實現了產品性能的優化和成本的降低。這一創新不僅提升了公司的市場競爭力,也為整個電子行業的發展注入了新的活力。
作為一家有社會責任感的企業,CST始終關注環境保護和社會公益事業。公司嚴格執行環保法規,積極推廣綠色生產理念,努力減少生產過程中的污染排放。此外,CST還積極參與社會公益活動,為當地的教育、文化等事業做出了積極貢獻。這些舉措進一步提升了CST的企業形象和社會聲譽。
為了進一步提升國際競爭力,AIC公司開始實施全球化布局戰略。公司先后在多個國家設立了研發中心和生產基地,以便更好地服務全球客戶。同時,AIC公司還積極參加國際展覽和交流活動,與海外企業建立合作關系,推動產品的全球化銷售。這些舉措使AIC公司的國際影響力不斷提升,市場份額也進一步擴大。
在電子行業的早期,CDI-DIODE公司以其精湛的技術研發能力嶄露頭角。公司通過不斷投入研發,成功開發出一款高效能、低成本的二極管產品,迅速占領了市場份額。這一技術突破不僅提升了公司的競爭力,也為整個電子行業帶來了革命性的變化。
隨著環保意識的日益增強,電子行業也開始向綠色生產轉型。CDI-DIODE公司積極響應這一趨勢,投入大量資源研發環保型二極管產品,并采用環保材料和生產工藝。這種綠色生產方式不僅降低了公司的生產成本,也符合了社會的可持續發展需求,為公司的未來發展奠定了堅實的基礎。
這五個故事雖然是虛構的,但它們反映了電子行業中企業可能面臨的一些共同挑戰和機遇。無論對于CDI-DIODE公司還是其他企業,這些故事都具有一定的借鑒意義。
作為CUI Devices的重要組成部分,其電機品牌在近年來取得了顯著的進步。公司的產品線涵蓋了電位器、旋轉編碼器、步進電機、步進伺服電機和伺服電機等多個領域。通過不斷的技術創新和市場拓展,CUI Devices的電機產品已經在全球范圍內贏得了廣泛的聲譽和市場份額。
void Task0 (void *pdata){uint8 err;uint16 i;pdata = pdata;Uart0ReviceMbox = OSMboxCreate(NULL);Uart3ReviceMbox = OSMboxCreate(NULL); OSMutexCreate(3,&err);Test2toTest = OSSemCreate(0);OSTaskCreate(TaskGetTime,(void *)0,&TaskGe ...… 查看全部問答∨ |
|
ADUC7060的DAC在16BIT插值模式下工作時,該數據格式是怎樣的 在12BIT的時候27:16 在16BIT的時候27:16 還有15:12 現在換了2種模式后,輸出沒什么區別! 這個16BIT下,哪個15:12的4位數據是 高4位還是低4位那 ...… 查看全部問答∨ |
|