RS-485半双工延时问题
學習485總線時,遇到延時問題,困擾很久。通過學習知道了485半雙工收發時必須延時,以保證系統的穩定性、可靠性。好多資料都介紹了485 防靜電、抗干擾電路。惟獨沒提 每一幀收發停止位(或第9位)的延時和 半雙工總線收發切換延時 問題。
我覺得在半雙工狀態下 485 幀的收發和 總線的收發狀態切換延時問題 對485總線長期穩定的工作有很大影響。徹底搞懂這個問題 對了解誤碼產生、數據丟失、總線的穩定性、可靠性都有重要意義。
以下來源laoguo 21ic的文章 整理后:
1、每一幀收發停止位(或第9位)的延時問題
在RS-485半雙工通訊中,一般以單片機的TI,RI信號作收發切換控制信號,發送時,檢測TI是否建立起來,當TI為高電平后關閉發送功能轉為接收功能,接收時,檢測RI是否建立起來,當RI為高電平后,接收完畢,又可以轉為發送。因此,必須控制端RE*,DE的信號的有效脈寬應該大于發送或接收一幀信號的寬度。
1
從上面的時序圖可知:單片機在串行口發送數據時,只要將8位數據位傳送完畢,TI標志即建立,但此時應發送的第九位數據位(若發送地址幀時)和停止位尚未發出。如果在這時關閉發送控制,勢必造成發送幀數據不完整。
接收數據時也同樣如此,單片機在接收完8個數據位后就建立起RI信號,但此時還未接收到第九位數據位(若接收地址幀時)和停止位。所以,接收端必須延時大于2位數據位的時間(1位數據位時間=1/波特率),再作應答,否則會發生總線沖突。
總之,發送和接收控制信號應該足夠寬,以保證完整地接收一幀數據,任意兩個單機的發送控制信號在時間上完全分開,避免總線爭端。
注:延時T秒的取值
(1) 傳送地址幀時,T>2X(1/波特率),可以選取T=2.5X(1/波特率)。
(2) 傳送數據幀時,T>1X(1/波特率),可以選取T=1.5X(1/波特率)。
實際的軟件流程:
1
問題:(【5樓】以解決)
可看到軟件流程并沒有在 每一幀收發停止位(或第9位)后實現延時,而是在(數據包的)最后一個字節(幀)上延時。這樣能保障數據幀的正確(完整性)和穩定性嗎?
2、半雙工總線收發切換延時問題
為了可靠的工作,在485總線狀態切換時需要做適當延時,再進行數據的收發。具體的做法是在數據發送狀態下,先將控制端置“1”,延時1ms左右的時間,再發送有效的數據,一包數據發送結束后再延時1ms后,將控制端置“0”。這樣的處理會使總線在狀態切換時,有一個穩定的工作過程。
------------------------------------------------------------------------------------------------------------------------------------------
| 兩個自動轉換(零延時)電路:
http://www.ouravr.com/bbs/bbs_upload19801/files_9/ourdev_230635.jpg 零延時電路圖:
他們如何保證 “控制端RE*,DE的信號的有效脈寬應該大于發送或接收一幀信號的寬度” 的? 但是這個問題依然存在: 可看到軟件流程并沒有在 每一幀收發停止位(或第9位)后實現延時,而是在(數據包的)最后一個字節(幀)上延時。這樣能保障數據幀的正確(完整性)和穩定性嗎? |
Maxim帶有自動方向控制的半雙工RS-485收發器
MAX13487E/MAX13488E半雙工RS-485收發器。該系列器件帶有AutoDirection功能,發送數據時可自動使能驅動器。這一特性省去了驅動使能控制信號。
----------------------------------------------------------------------------------------------------------------------
今天調了232/485電路,都未延時,開了3小時,每秒發/收一個包(9600bps,8/30字節,不定長),無錯誤。
用下面兩個圖 直接把原來的程序(232下的上、下位機)未做任何修改搞成 485了。
上位機用的圖:
下位機用的圖:
----------------------------------------------------------------------------------
半雙工總線收發切換延時問題 1ms。有好多帖上說用1ms延時,通訊就穩定了,不用則出現誤碼。不知究竟為何?
總結下:
1、總線上不間斷(長時間連續)的發送數據會產生累積誤差(不同晶振頻率的誤差)。所以用延時(暫停通信一段時間)來消除波特率的誤差,避免數據錯誤。
2、485器件在收、發狀態轉換時,需要轉換時間來過渡到穩定狀態。
總結
以上是生活随笔為你收集整理的RS-485半双工延时问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes系列之Helm介绍篇
- 下一篇: linux关闭ACPI电源管理模块