相信有小伙伴們遇到過這樣的問題,在使用GD32進行串口485發送的時候,明明發送了特定長度的數據,但從機就是不響應,現在就讓我們來解析下最常見的一個原因。
我們先來看一段代碼:
這是采用輪訓方式進行485發送的函數,首先將485傳輸方向設置為發送,然后進行長度為len的數據發送,發送完成后將485傳輸方向設置為接收。看似這段代碼沒有問題,但當放在MCU上運行后發現,從機會少收到兩個字節的數據。
這是因為,串口是有數據寄存器和移位寄存器,當最后一次判斷TBE不為“0”并調用usart_data_transmit函數后,實際上倒數第二個字節的數據正在發送移位寄存器中對外發送,最后一個字節在數據寄存器中,此時如果將485傳輸方向改為接收,那么最后兩個字節的數據將不會發送到485總線上。
解決這個問題的辦法也很簡單,只需要增加一個判斷TC的過程就可以了。
TC標志位用來指示是不是所有的數據(包括數據寄存器和發送移位寄存器)都已經發送完成,如果發送完成則置“1”。
前面講述的是使用輪訓方式進行發送,如果用DMA發送和中斷發送怎么辦呢?其實道理是一樣的,在DMA發送和中斷發送兩種模式中都要打開TC中斷,只有進入了TC中斷后,才能將傳輸方向切換為接收,小伙伴們明白了嗎?
-
單片機
+關注
關注
6035文章
44554瀏覽量
634642 -
串口
+關注
關注
14文章
1551瀏覽量
76426 -
GD32
+關注
關注
7文章
403瀏覽量
24328
發布評論請先 登錄
相關推薦
評論