一、問題發(fā)現(xiàn)
? ? ? ? 在項目中我想通過阻塞的方式接收一段來自串口的數(shù)據(jù),于是使用了HAL_UART_Receive函數(shù),但跑起來發(fā)現(xiàn)一直超時接收不到。網(wǎng)上使勁搜但沒搜到啥有用的結(jié)果,那只能自己搗鼓了。一開始懷疑是硬件的問題,于是用示波器直接連到對應(yīng)的rx腳上,發(fā)現(xiàn)數(shù)據(jù)正常;于是我又嘗試使用中斷接收的方式,發(fā)現(xiàn)也能接收。那么,基本可以確定是HAL_UART_Receive這個函數(shù)本身有問題了。
?文章來源:http://www.zghlxwxcb.cn/news/detail-510163.html
二、問題追蹤
? ? ? ? 進入debug,并打開使用的USART的寄存器監(jiān)視(我使用的USART1),發(fā)現(xiàn)RXEN一直都是0,ORE一直都是1(這兩個都是ISR寄存器中的標(biāo)志,關(guān)于USART的寄存器介紹,可看看這篇文章STM32單片機,UART的寄存器配置以及工作原理),也就是說,這個函數(shù)中沒有清除ORE標(biāo)志的動作,導(dǎo)致串口在收到第一個數(shù)據(jù)后,再沒機會去接收第二個數(shù)據(jù);這時候再看HAL_UART_Receive,不論在接受前,還是在接收循環(huán)體內(nèi),都沒看到OREF的清除代碼
循環(huán)接受中未看到OREF的清除
三、問題解決
? ? ? ? 把USART的ISR(鏈接文章中為SR)寄存器看一下,再通過上面的解釋,問題就可以解決了,只要在HAL_UART_Receive的循環(huán)體內(nèi)添這么一句話
? ? ? ? ?現(xiàn)在終于可以正常阻塞接收了!
?
? ? ? ? 最后,本著不動庫函數(shù)的原則(防止cube重新生成后忘了修改),建議在某個地方重寫這個函數(shù)并引用?。如果文章中有什么不對的地方,歡迎指正!文章來源地址http://www.zghlxwxcb.cn/news/detail-510163.html
到了這里,關(guān)于關(guān)于STM32使用HAL_UART_Receive()無法接收數(shù)據(jù)的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!