相信有小伙伴們遇到過這樣的問題,在使用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上運行后發(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中斷后,才能將傳輸方向切換為接收,小伙伴們明白了嗎?