相信有小伙伴們遇到過(guò)這樣的問(wèn)題,在使用GD32進(jìn)行串口485發(fā)送的時(shí)候,明明發(fā)送了特定長(zhǎng)度的數(shù)據(jù),但從機(jī)就是不響應(yīng),現(xiàn)在就讓我們來(lái)解析下最常見(jiàn)的一個(gè)原因。
我們先來(lái)看一段代碼:
這是采用輪訓(xùn)方式進(jìn)行485發(fā)送的函數(shù),首先將485傳輸方向設(shè)置為發(fā)送,然后進(jìn)行長(zhǎng)度為len的數(shù)據(jù)發(fā)送,發(fā)送完成后將485傳輸方向設(shè)置為接收??此七@段代碼沒(méi)有問(wèn)題,但當(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è)問(wèn)題的辦法也很簡(jiǎn)單,只需要增加一個(gè)判斷TC的過(guò)程就可以了。
TC標(biāo)志位用來(lái)指示是不是所有的數(shù)據(jù)(包括數(shù)據(jù)寄存器和發(fā)送移位寄存器)都已經(jīng)發(fā)送完成,如果發(fā)送完成則置“1”。
前面講述的是使用輪訓(xùn)方式進(jìn)行發(fā)送,如果用DMA發(fā)送和中斷發(fā)送怎么辦呢?其實(shí)道理是一樣的,在DMA發(fā)送和中斷發(fā)送兩種模式中都要打開(kāi)TC中斷,只有進(jìn)入了TC中斷后,才能將傳輸方向切換為接收,小伙伴們明白了嗎?
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634634 -
串口
+關(guān)注
關(guān)注
14文章
1551瀏覽量
76421 -
GD32
+關(guān)注
關(guān)注
7文章
403瀏覽量
24328
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論