STM32串口通信可以分為查詢,中斷,DMA三種方式進行通訊,本文主要就中斷的方式進行講解,采用中斷的方式進行通訊時,可以使能接受非空中斷(RXNE),當接收到一個資料時就產生一個中斷,將接收到的資料通過移位暫存器移位到RDR中,此時我們可以直接將接收到的資料發送出去,則完成了一個字符的通訊,以后每次接收到一個資料就發送一個資料出去,如此便實作了接收到什么資料便發送什么資料的功能,而本文將要討論先將其他設備發送來的資料全部接收完成,再將一整幀的資料發送出去的通訊方法,(串口通訊原理圖如下)

方法一:采用定時器的方法判斷一組資料幀是否接收完成,在接收到第一個字符時打開定時器,在持續接收到資料時不斷更新定時器的值,當沒有接收到資料時,定時器的值不再更新,會產生超時溢位,觸發溢位中斷,從而判斷一組資料幀接收完成(注:定時器的值要設定合理,不能大于兩組資料幀發送之間的間隔,如采用modbus協議時3.5個字符的時長;也不能小于兩個發送字符之間的時長),具體操作如下:首先根據波特率計算定時器設定的一個具體時間,在串口中斷中接收到第一個字符開啟定時器,并在每一次接收到資料進入串口中斷時將定時器的計數清零,若定時器達到我們設定的時間便認為一個資料幀接收完成,
方法二:通過對資料幀的幀尾進行判斷來識別一組資料幀是否接收完成;因為在電腦上按下回車鍵或發送新行,幀尾會出現0x0A,0X0D這兩個,我們只要判斷是否連續出現0A,0D便可判斷一組資料幀是否傳輸完成,
方法三:采用STM32自帶的空閑中斷(IDLE)來判斷一組資料幀是否接收完成;首先,在串口初始化中使能空閑中斷(IDLE),再在中斷服務函式中判斷中斷標志位(USART_FLAG_IDLE)(這里只能用中斷標志位來判斷而不是中斷,具體原因還未查清,實操是不行),當標志位置位時,將接收到的一幀資料發送出去,另外,空閑標志位只有在RXNE再次置1時才能使能(注意,USART_FLAG_IDLE的判斷在中斷服務函式中,但是需要在清除RXNE標志位之后判斷),空閑標志位必須采用先讀狀態暫存器,再讀資料暫存器才可以清除,不能采用普通的呼叫清除函式來清除,具體操作代碼如下:

RXNE中斷和IDLE中斷的區別:
當接收到1個位元組,就會產生RXNE中斷,當接收到一幀資料,就會產生IDLE中斷,比如給STM32一次性發送了10個位元組,就會產生10次RXNE中斷,1次IDLE中斷,
總的來說,這三種方式都可以實作接收不定長的資料幀,接收完成,再發送的功能,但是相對來說第三種方式比較推薦,操作起來簡單,且不需要占用定時器資源,另外,對于第二種方法,對從傳感器接收來的資料就不太適用,可能你沒辦法獲得其具體的資料幀格式,如此通過幀尾來判斷的方法就不太適用了,相對比來說,方法三,采用空閑中斷(IDLE)的方式適用性較好,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398490.html
標籤:其他
上一篇:知識點總結-文章串列匯總
下一篇:WSN無線傳感網
