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

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

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

TC標(biāo)志位用來指示是不是所有的數(shù)據(jù)(包括數(shù)據(jù)寄存器和發(fā)送移位寄存器)都已經(jīng)發(fā)送完成,如果發(fā)送完成則置“1”。
前面講述的是使用輪訓(xùn)方式進(jìn)行發(fā)送,如果用DMA發(fā)送和中斷發(fā)送怎么辦呢?其實道理是一樣的,在DMA發(fā)送和中斷發(fā)送兩種模式中都要打開TC中斷,只有進(jìn)入了TC中斷后,才能將傳輸方向切換為接收,小伙伴們明白了嗎?
-
單片機(jī)
+關(guān)注
關(guān)注
6074文章
45322瀏覽量
662889 -
串口
+關(guān)注
關(guān)注
15文章
1605瀏覽量
81873 -
GD32
+關(guān)注
關(guān)注
7文章
429瀏覽量
26911
發(fā)布評論請先 登錄
GD32和STM32單片機(jī)的區(qū)別
GD32 485發(fā)送異常最常見原因#GD32 #單片機(jī) #單片機(jī)開發(fā) #嵌入式開發(fā)
什么是GD32
GD32芯片包添加步驟有哪些
如何利用stm32f407+485發(fā)送modbus RTU協(xié)議
RS485發(fā)送時,影響其他串口接收?為什么呢?
STM32F103ZET6基于RS485發(fā)送接收簡單例程
GD32 DMA串口通訊DEMO
stm32f407+485發(fā)送modbus RTU協(xié)議 適合初學(xué)者
485發(fā)送接收切換問題討論
GD32芯片怎么樣?GD32芯片運(yùn)行速度慢的原因
gd32和stm32哪個好?
GD32與STM32兼容嗎?
GD32 MCU ISP失敗的原因

GD32 485發(fā)送異常最常見原因
評論