相信有小伙伴們遇到過這樣的問題,在使用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)注
6020文章
44351瀏覽量
628200 -
串口
+關(guān)注
關(guān)注
14文章
1533瀏覽量
75436 -
GD32
+關(guān)注
關(guān)注
7文章
398瀏覽量
23966
發(fā)布評論請先 登錄
相關(guān)推薦
評論