關於RS485匯流排通訊協議開發注意事項

2021-06-16 23:35:53 字數 3015 閱讀 1235

關於rs485匯流排通訊協議開發注意事項

1       前言

近段時間發現我們系統在進行裝置組態時,採用的串列埠復用方式在同乙個rs485串列埠上掛載多個智慧型裝置進行通訊、監控。而往往在系統組態的時候就會發現部分裝置通訊不上,或者工程交付之後出現智慧型裝置經常通訊中斷的情況。本文描述rs485匯流排協議的工作原理,從根本上剖析導致以上問題的根本原因。

2rs485匯流排硬體特點

2.1     拓撲結構

rs485匯流排一般採用1對1和1對多的組網方式,很少有多對多的場合,主要原因是rs485沒有匯流排仲裁,多對多會導致多個裝置在匯流排上訊號衝撞,最終無法正常通訊。

2.2     匯流排掛載能力

rs485的匯流排掛載能力一般有三種等級,32節點(max485)、128節點(max1487)、256節點(max1483)。

3rs485匯流排軟體特點

3.1     互動方式

rs485基本上採用一問一答的互動方式,主裝置向從裝置傳送一條指令,從裝置執行指令之後,返回一條應答命令。

特殊情況下,在資料互動不頻繁的場合中,為了提高反應速度,也有從裝置主動向主裝置傳送資料的用法。

3.2     位址

為了區分主裝置以及多個從裝置,在互動的訊息幀當中的從裝置的位址是必需的,否則無法區分具體的裝置。

如果一大堆從裝置當中有位址相同的話,將導致通訊異常。

3.3     校驗

rs485匯流排一般具備校驗,主要是因為通訊線路很長,存在干擾的可能性很大,校驗是對資料準確性的必要檢驗手段。

4       協議處理

4.1     幀結構分析

4.1.1 問題

早期485裝置的處理器大多採用8為低速微控制器。在協議的解析處理上因資源受限,往往做得不是很完善,導致在多裝置組網的情況下,發生通訊異常的情況。

4.1.2 有起始符和結束符

soh

addr

lendata0

………datan

crceoh

常用的soh例如0x7e,eoh例如0x0d。

特點是具備特殊定義的起始符和結束符,在接收端很容易判斷是否有接收到完整的資料幀。接收完畢後再進行後處理。後處理包括位址判斷、crc校驗、以及協議解析。

4.1.3 無起始符

addr

lendata0

………datan

crc

因為沒有起始符,很難判斷是否收到乙個完整的資料幀,每收到乙個位元組都要處理一次。處理起來很痛苦,但是微控制器程式恰恰相反,喜歡這麼做。

4.2     接收處理方法。

4.2.1 對於有起始符和結束符的協議來說,很少出問題,畢竟只要通過2個字元就可從匯流排上獲取乙個完整的資料幀。如果匯流排上掛的裝置都是這種協議的裝置,很少發生故障。

4.2.2 對於沒有特殊字元的協議幀,處理起來比較麻煩,問題也比較多。

4.2.2.1  方法1

接收到第1個字元之後,就立刻判斷是否與本機位址匹配,如果不是,則停止接收資料,等待一段時間之後再接收。停止接收資料的目的在於丟掉該幀後續的資料。

特點:處理方式簡單,cpu開銷比較少。但是因為停止接收的時間段一般是固定的且預留得比較寬,有可能在停止接收的這個時間段內收到屬於本機的資料幀,卻沒收到。

4.2.2.2  方法2

收到第1個字元之後,不立即處理,直到接收完整的長度描述符(len)後,再根據長度描述符定義的長度,接收完一幀之後再處理。處理包括位址判斷、crc校驗、以及協議解析等。

特點:能很快的接收到完整的資料報,但是不是本地的資料報也接收進來了,對低端的cpu來說是個壓力。

4.2.2.3  方法3

收到1個字元之後,如果超過多長時間沒有接收到下乙個字元,則認為是資料報結束,對資料進行處理。

特點:和方法2類似,對低端的cpu來說是個壓力。另外的好處就是可以降低處理函式的複雜度,不需要計算資料報的長度,並依次接收。

但是字元超時的時間很難把控,如果雙發都是自己廠家的裝置問題不大,如果接了很多品牌的裝置,就會出現其他問題。

4.2.2.4  方法4

結合方法2和方法3,對cpu有一定的壓力,但是接收效果最好。響應迅速。

4.2.3 協議解析的錯誤做法

4.2.3.1  有些協議需要回送確認。例如控制台。

4.2.3.2  有些協議智慧型在接收到正確的資料報之後才能回送。但是某些裝置接收到了非法的資料之後也回送錯誤**應答,導致與匯流排其他廠家裝置衝突。

4.3     帶來的問題

4.3.1 對於方法1,停止接收的時間段一般是固定的且預留得比較寬,有可能在停止接收的這個時間段內收到屬於本機的資料幀,卻沒收到。如過匯流排上資料量大的話,可能會一直存在這種問題,一直通訊不上。

4.3.2 對於方法2,接收端是沒有問題的,但是可能會影響到使用了方法1和方法3的裝置,因為方法2接收得快,應答的也快。對於方法1而言,應答的2個資料報緊跟在一起,長度比較長,時間也比較長,有可能接收到中間的部分資料,結果是錯誤的。更嚴重的是,因為接收到了錯誤的資料,從裝置會回送乙個錯誤應答,與原有的其他裝置的正確資料衝突,導致所有的通訊都失敗。

5       解決辦法

5.1     在協議組態的時候,因為現場裝置已經安裝好,並且很多並不是我們廠家的裝置,讓其他廠家來配合我們調整程式並不現實,那麼可以通過一下方式來解決這些問題。

5.2     錯開波特率

不同廠家裝置之間,使用不同的波特率,且錯開也大越好,例如兩個廠家都支援1200到38400,則乙個廠家用最低的,另乙個廠家用最高的。

5.3     增加命令之間的間隔時間

5.3.1 在同乙個裝置當中,需要讀取多條指令才能完成資料的採集,那麼在每條指令之間做個延時(200ms-500ms)。

5.3.2 在不同裝置切換時,上述時間可以更長一點(500ms-2s)。

5.3.3 以上時間可以根據現場情況進行適當調整,多次測試,獲取最佳的時間,既要保證可靠的通訊,又不能讓系統的響應速度受到明顯的影響。

5.4     歸零

傳送指令之前,先清空接收緩衝區,預防累加有其他無效的資料。

通訊匯流排 RS485(二)

rs485通訊匯流排究竟使用幾根線?這個問題之前沒有深究過。趁著使用modbus通訊的機會仔細研究了下。通訊時使用隔離電源已沒有疑問 如有疑問,可參考我 rs485 一 文章 現在有個新的問題,使用隔離電源後,是否要將節點的隔離電源地連線在一起。原因分析 rs485兩邊的gnd不連線,如果將gnd連...

RS485通訊和Modbus通訊協議彙總

rs 485上的軟體層協議modbus主要依賴於主從模式。主從模式是指在半雙工通訊方式上,2個或者2個以上的裝置組成的通訊系統中 特別提醒,rs 485硬體協議決定,對於每乙個位元組資料的傳輸是先發高位,再發地位,所以假設陣列u8型陣列revarr 2 存放著接收到的資料,那麼接收端解析資料應該是u...

RS 485匯流排前世今生

一 rs232和rs485的區別 rs 232採取的是單端不平衡傳輸方式,其收發端的資料訊號都是相對於地訊號的,所以共模抑制能力 差。再加上雙絞線分布電容的影響,其最大傳輸距離僅為15公尺,最高傳輸速率只有20kbit s 2560byte s 485匯流排採用了平衡傳送和差分接收介面標準,使用半雙...