相信有小伙伴們遇到過這樣的問題,在使用GD32進行串口485發送的時候,明明發送了特定長度的數據,但從機就是不響應,現在就讓我們來解析下最常見的一個原因。
我們先來看一段代碼:
![wKgaomWl3gqAJZXVAABoigA4cuY198.png](https://file1.elecfans.com/web2/M00/BD/A4/wKgaomWl3gqAJZXVAABoigA4cuY198.png)
這是采用輪訓方式進行485發送的函數,首先將485傳輸方向設置為發送,然后進行長度為len的數據發送,發送完成后將485傳輸方向設置為接收。看似這段代碼沒有問題,但當放在MCU上運行后發現,從機會少收到兩個字節的數據。
這是因為,串口是有數據寄存器和移位寄存器,當最后一次判斷TBE不為“0”并調用usart_data_transmit函數后,實際上倒數第二個字節的數據正在發送移位寄存器中對外發送,最后一個字節在數據寄存器中,此時如果將485傳輸方向改為接收,那么最后兩個字節的數據將不會發送到485總線上。
![wKgaomWl3g6AGAiqAAFHRDPXKl8257.png](https://file1.elecfans.com/web2/M00/BD/A4/wKgaomWl3g6AGAiqAAFHRDPXKl8257.png)
解決這個問題的辦法也很簡單,只需要增加一個判斷TC的過程就可以了。
![wKgZomWl3hOAb3ZeAACHd7DUbGU502.png](https://file1.elecfans.com/web2/M00/BC/B7/wKgZomWl3hOAb3ZeAACHd7DUbGU502.png)
TC標志位用來指示是不是所有的數據(包括數據寄存器和發送移位寄存器)都已經發送完成,如果發送完成則置“1”。
前面講述的是使用輪訓方式進行發送,如果用DMA發送和中斷發送怎么辦呢?其實道理是一樣的,在DMA發送和中斷發送兩種模式中都要打開TC中斷,只有進入了TC中斷后,才能將傳輸方向切換為接收,小伙伴們明白了嗎?
-
單片機
+關注
關注
6043文章
44621瀏覽量
638569 -
串口
+關注
關注
14文章
1557瀏覽量
77044 -
GD32
+關注
關注
7文章
413瀏覽量
24471
發布評論請先 登錄
相關推薦
GD32和STM32單片機的區別
![<b class='flag-5'>GD32</b>和STM32單片機的區別](https://file1.elecfans.com/web2/M00/8F/A1/wKgZomTQuL6ATOgdAAT4L3Bk_D8327.png)
![](https://file1.elecfans.com/web2/M00/BD/D1/wKgaomWnMVGACSGxAArhVn5sr2s230.png)
什么是GD32
GD32芯片包添加步驟有哪些
如何利用stm32f407+485發送modbus RTU協議
RS485發送時,影響其他串口接收?為什么呢?
STM32F103ZET6基于RS485發送接收簡單例程
GD32 DMA串口通訊DEMO
![<b class='flag-5'>GD32</b> DMA串口通訊DEMO](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32f407+485發送modbus RTU協議 適合初學者
![stm32f407+<b class='flag-5'>485</b><b class='flag-5'>發送</b>modbus RTU協議 適合初學者](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
GD32芯片怎么樣?GD32芯片運行速度慢的原因
gd32和stm32哪個好?
GD32與STM32兼容嗎?
GD32 MCU ISP失敗的原因
![<b class='flag-5'>GD32</b> MCU ISP失敗的<b class='flag-5'>原因</b>](https://file1.elecfans.com/web2/M00/C1/B2/wKgZomXeix-AYt0QAAA9fb4pF5E360.png)
評論