相信有小伙伴們遇到過這樣的問題,在使用GD32進行串口485發(fā)送的時候,明明發(fā)送了特定長度的數據,但從機就是不響應,現(xiàn)在就讓我們來解析下最常見的一個原因。
我們先來看一段代碼:

這是采用輪訓方式進行485發(fā)送的函數,首先將485傳輸方向設置為發(fā)送,然后進行長度為len的數據發(fā)送,發(fā)送完成后將485傳輸方向設置為接收。看似這段代碼沒有問題,但當放在MCU上運行后發(fā)現(xiàn),從機會少收到兩個字節(jié)的數據。
這是因為,串口是有數據寄存器和移位寄存器,當最后一次判斷TBE不為“0”并調用usart_data_transmit函數后,實際上倒數第二個字節(jié)的數據正在發(fā)送移位寄存器中對外發(fā)送,最后一個字節(jié)在數據寄存器中,此時如果將485傳輸方向改為接收,那么最后兩個字節(jié)的數據將不會發(fā)送到485總線上。

解決這個問題的辦法也很簡單,只需要增加一個判斷TC的過程就可以了。

TC標志位用來指示是不是所有的數據(包括數據寄存器和發(fā)送移位寄存器)都已經發(fā)送完成,如果發(fā)送完成則置“1”。
前面講述的是使用輪訓方式進行發(fā)送,如果用DMA發(fā)送和中斷發(fā)送怎么辦呢?其實道理是一樣的,在DMA發(fā)送和中斷發(fā)送兩種模式中都要打開TC中斷,只有進入了TC中斷后,才能將傳輸方向切換為接收,小伙伴們明白了嗎?
-
單片機
+關注
關注
6067文章
44989瀏覽量
650362 -
串口
+關注
關注
15文章
1588瀏覽量
79919 -
GD32
+關注
關注
7文章
421瀏覽量
25474
發(fā)布評論請先 登錄
GD32和STM32單片機的區(qū)別


GD32 485發(fā)送異常最常見原因#GD32 #單片機 #單片機開發(fā) #嵌入式開發(fā)
什么是GD32
GD32芯片包添加步驟有哪些
如何利用stm32f407+485發(fā)送modbus RTU協(xié)議
RS485發(fā)送時,影響其他串口接收?為什么呢?
STM32F103ZET6基于RS485發(fā)送接收簡單例程
GD32 DMA串口通訊DEMO

stm32f407+485發(fā)送modbus RTU協(xié)議 適合初學者

485發(fā)送接收切換問題討論

GD32芯片怎么樣?GD32芯片運行速度慢的原因
gd32和stm32哪個好?
GD32與STM32兼容嗎?
GD32 MCU ISP失敗的原因

評論