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

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

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

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

GD32用Embedded軟件debug在線調(diào)試失敗的原因?

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

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

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

GD32芯片怎么樣?GD32芯片運(yùn)行速度慢的原因
GD32與STM32兼容嗎?
GD32 MCU ISP失敗的原因

評(píng)論