串列口,spi,RS232,RS485,RJ45口以及Modbus協議,這些的區別和共同點是什麼?

串列口,RS232,RS485,RJ45口,以及Modbus協議,這些的區別和共同點是什麼。

哪些是協議,哪些是介面,什麼協議對應什麼樣的介面,求高人指導,迷糊很久了!


我們先來看介面:

設想直流電源,它的輸出端插座介面有三個管腳,分別是正極、負極和接地極。相應地,負載的插頭也應當有三個管腳與電源側一一對應,這樣才能正確地獲得電能供應。

注意到這裡有三個必須滿足的條件:

第一是插頭和插座管腳的形狀、大小和插針直徑及長度必須一一對應,否則無法完成接插操作。這一點規定了插頭組合的物理結構和管腳定義。

第二是電源的輸出電壓值必須滿足載側的需求值,否則無法完成電參量的要求。這一點決定了插頭組合的電平規範。

第三是電源的輸出阻抗與負載的輸入阻抗必須匹配,否則不能實現完善的供電。這一點決定了電源的工作性質。

這三點其實就是電源插頭組合在物理層面上的規範性協議。

再看通信介面。在有關計算機信息交換的ISO(國際標準化組織)OSI模型里,物理層是最底層(第一層),它規定了介面的機械外形、介面管腳定義、介面電平和位元組格式。

這裡的位元組格式,指的是一個位元組中有幾個數據位,有幾個起始位/停止位,有幾個奇偶校驗位。一般地,一個位元組有8個數據位,1個起始位(停止位),和1個奇偶校驗位。注意:起始位和停止位可以合併。

再看通信介面和通信網路的工作制問題。

當我們拿手機掛電話時,我們發現通信雙方在通話的同時也可以接聽,這叫做全雙工(雙向工作制);如果說話的時候不能聽,而接聽的時候不能說,但任何一方都具有說和聽的能力,也即對講機的通話型式,這叫做半雙工。

(說明一下:這些圖是我在ABB所做的有關MODBUS通信的PPT節錄,比較早了,但基本內容是正確的。這些圖供參考。)

RS422介面和RS232介面是全雙工介面,而RS485則是半雙工介面。

對於半雙工介面,顯然需要有通信的發起者,所以RS485介面和網路一定具有主站和若干從站,並且從站的數量也有規定。一般地,從站的數量是32個。

RS485主站與從站的關係問題,看似只是通信工作制的不同,其本質是通信各方對通信匯流排控制權的合理分配。

我們再看匯流排連接問題。

我們還是以電源為例。我們可以從電源引出一條主幹線,然後再並聯若干個支路並分別送到若干個負載。只要滿足電源的功率要求,顯然這是可行的。

如果我們用同樣的方法來引出RS485的通信線,是否可行呢?答案是否定的。我們必須從通信主站先引一條線到第一個通信子站,再從第一子站引第二條線到第二子站,如此循環直到最後一個子站。在通信線的終端,還要配一個終端電阻。在這條通信線路上,任何一點如果發生斷路,則後續的通信鏈路上的通信也就斷了。這種接線方法形象地被稱為菊花瓣連接方法,或者鏈形連接方法,而電源的接線方法則被稱為星形連接方法。

我們發現,從電氣接線來看,鏈路是並聯的。但從通信來看,鏈路是菊花瓣的,屬於一個接一個的有秩序的連接。

現在我們可以總結一下了:RS485的匯流排網路接線方式必須是鏈形菊花瓣的接線方式,並且屬於半雙工的通信方式;RS232是點到點的接線方式,屬於全雙工通信。不管是RS232介面,還是RS485介面,它們必須符合物理層的通信規約。

再看MODBUS-RTU通信協議:

有了物理層通信介面,是不是就能通信呢?答案是否定的。物理層通信介面只是使得通信雙方具備通信條件而已。但若雙方說的話誰都聽不懂,或者通信雙方的說話方式及語法結構不相符,顯然這也無法通信。

在OSI模型中,物理層之上是數據鏈路層。MODBUS-RTU協議就是數據鏈路層協議,只要通信雙方都採用了MODBUS-RTU協議,則能確保通信語言是雙方都能聽得懂的語句格式。

注意這裡的辭彙「語句」。物理層定義的是位元組,相當於語言中的字,數據鏈路層則把位元組組織成語句,也即幀。幀規定了通信雙方所用語句的語法結構。

MODBUS也是主從式的。和物理層的匯流排控制是一樣的,這裡的主從關係,就是對通信匯流排的控制權做了規定。主站先下達命令,佔用匯流排;接著把匯流排空置,交給從站去寫回應碼;從站完成後,再把匯流排還給主站。

現在我們來看看ISO的HDLC規定的幀結構,也即通信語句的語法結構,如下:

在MODBUS通信協議下,不同的命令功能碼它的幀結構不盡相同。對於讀寄存器命令,MODBUS的主站幀結構是:2個位元組的地址碼,1個位元組的功能碼,2個位元組的數據地址碼,2個位元組的CRC校驗碼;MODBUS的從站回應幀結構是:2個位元組的功能碼,1個位元組的回應區位元組總數,N個位元組的回應數據,2個位元組的CRC校驗碼。

雖然物理層協議與數據鏈路層協議不同,但數據鏈路層協議的執行必須建立在通信雙方物理層連接已經符合要求,並且已經可以無障礙地實現信息交互的基礎上。

這個規則在ISO/OSI模型的七層協議中必須完全徹底地得到執行。在ISO/OSI模型中,通信雙方的低層次協議必須為上層協議建立透明的無故障的連接和信息交換關係。也就是說,各層次的上下級關係必須是絕對的。

從數據鏈路層再往上,就是網路層了。它的任務是構成現場匯流排的信息交換網。

網路層的功能包括:把通信幀打包成數據分組,然後把數據分組發送給對方。

由於通信雙方的網路結構可能不同,於是對於同種網就需要用網橋來連接,而異種網則需要用網關來連接。

網路之間的信道可能有多條。數據分組在發送時有多種路徑可以選擇。負責選擇路徑的元件稱為路由器。路由器不但決定了真實的數據交換網路路徑,還可以構建虛擬的網路路徑,還要決定數據分組的發送秩序。因此,路由器是網路層中最複雜最關鍵的裝備。

OSI模型中,把物理層+數據鏈路層+網路層合併稱為現場匯流排,其通信介面就是8針的RJ45水晶頭。顯見,RJ45與RS232/RS485/RA422完全不是一回事。

網路層的數據分組是數據幀的組合。通俗地說,數據分組是一篇短文,或者是一頁待傳遞的數據組合單元。

網路層在發送數據分組時,其路由問題和接收組合問題見下圖:

我們看到網路層在通信時先由路由器確定路由路徑,然後把分組發送到對方。對方接收到分組後,把分組按前後秩序組合起來,再解包為實際文檔。

指的注意的是:由於網路層有了路由器,因此網路層支持星形網路結構。

現在我們來關注一下ISO/OSI的7層模型,如下:

由於題主並未提及更高層的協議,我們也就給予忽略。但需要明確的是:從網路層再往上,各層之間發送的信息單位已經是完整的報文了。OSI模型也規定了報文的語法結構,限於篇幅給予忽略。

====================

值得注意的是:RS232/RS485/RS422通信介面以及它們的定義,是非常明確的。包括管腳的電平,管腳的功能定義,以及介面在信息發送和接收信息時的數據流時序關係,這些都必須準確和嚴格,否則就無法執行信息交換。

=====================

當PLC與某電力儀錶交換信息,並且這些電力儀錶符合RS485/MODBUS-RTU通信規範。我們要做什麼事呢?

第一,我們按菊花瓣結構的通信鏈路要求去接線,將PLC的通信介面與N個電力儀錶介面連接起來。最後一個電力儀錶的末端要配100歐的終端電阻。

第二,我們把這N個電力儀錶按地址遞增的原則確定各自的地址,例如01H、02H、1FH等等。這裡的H表示是16進位,1F表示16+15=31。

第三,我們在PLC編程軟體中設定好電力儀錶規定的通信速率

第四,我們在PLC編程軟體中按電力儀錶的數據區地址碼設定好MODBUS通信碼,以及各個子站的循環關係。

注意,這裡的MODBUS通信碼滿足PLC的IEC61131-3編程模塊要求,一般的PLC梯形圖沒有此功能。梯形圖滿足IEC 61131-1要求,但不滿足IEC 61131-3要求。

第五,在PLC的內存中開闢專用數據區,存放從電力儀錶讀取到並處理後的信息,以便讓更高層的總站來讀取信息。此數據區有一個名稱,叫做數據點表,有時也簡稱通信協議。

最後,當然就是開機測試了。其中的內容很多,限於篇幅不再介紹。

======================

我們來看一個在RS485網路上用MODBUS-RTU讀取數據的例子,如下:

某電力儀錶,地址是01H。在電力儀錶內存第2000的位置上,放置了三相電流和三相電壓等6個數據,每個數據佔用兩個位元組,共12個位元組。

此電力儀錶的通信速率是9600bps。什麼意思呢?bps表示一個0/1,也就是比特,這說明每秒鐘這條匯流排上可以發送9600個比特。我們已經知道一個位元組有8個數據位,1個起始位,1個奇偶校驗位,剛好10位或者10個比特,所以,如果電力儀錶的通信速率是9600bps,那麼1秒鐘就可以發送:

9600/10=960個位元組。

我們還知道,主站的讀數據的幀結構(下行幀)中,有1個位元組的地址,1個位元組的功能碼,2個位元組的內存地址,2個位元組的數據數量,2個位元組的CRC校驗碼,總共有8個位元組,所以主站發送讀數據MODBUS通信幀佔用的時間是:8X10/9600=8.33毫秒。

對於本例,我們知道MODBUS-RUT讀數據的命令是0X03H,也即03命令。注意這裡的寫法:0X是字頭,中間的03是命令,最後的H表示是16進位。

具體通信幀的是:01 03 07 D0 00 06 C5 45,其中0X01H是地址,0X03H是命令,0X07D0H是內存地址2000,0X0006H表示讀取連續6個字,也即內存中的電流和電壓參數,0XC545H是01 03 07 D0 00 06的CRC校驗碼。

那麼電力儀錶的回應幀(上行幀)的幀結構是:1個位元組的地址,1個位元組的功能碼,1個位元組的數據區位元組數,12個位元組的數據,2個位元組的CRC校驗碼,總共17個位元組,佔用時間是:17X10/9600=17.7毫秒。

具體的儀錶回應通信幀是:01 03 0C 00 64 0064 0064 00 DC 00 DC 00 DC D6 F5,其中0X01H和0X03H的意義同前,0X0CH表示上傳數據區有12個位元組,0X0064H表示A相電流為100A,後面的兩組為B相和C相電流,均為100A,0X00DCH表示A相電壓為220V,其後兩組為B相和C相電壓,均為220V,最後0XD6F5H為CRC校驗碼。

從主站發起下行通信幀,再等待10毫秒讓從站回應,再接收到從站發還的上行通信幀,總歷時為:

T=8.33+10+17.7=36.03ms

如果有31個相同的儀錶等待主站一一訪問,則主站從訪問第一個儀錶開始,到最後回應完畢,總歷時:

T=31	imes 36.03	imes 10^{-3} approx 1.12s

這裡的1.12秒就是在通信速率為9600bps下這31台儀錶的讀數據循環周期,且忽略了主站再次發送下行通信幀的等待時間,實際時間會略微再長一些。

相信,看到這裡,大家對MODBUS-RTU下的通信幀應當有了較為深刻的認識。

提醒大家:一個字有兩個位元組。一般地,位元組只能用來表達8個開關量。但對於模擬量,則要用字來表達。例如電流1250A,16進位下是04E2H,要用2個位元組才能表達完整。也因此,各種電力儀錶中,模擬量都是用字來表達的。

以下是MODBUS的部分常用功能碼,也即命令碼:

以下是PLC在讀取雙投開關ASCO控制器的數據點表的下行和上行通信幀範例:

幾個相關的問題解釋一下:

1)有些現場匯流排,用令牌解決了匯流排的控制權問題。

大家很容易想到,如果從站有緊急事項需要主站來服務,可是MODBUS規定了輪詢規則,等到自己的時候,可能會太遲了。於是許多現場匯流排就發明了一個特殊的東西,叫做令牌。令牌很短,只有一個位元組,它可以很快地在匯流排上傳遞。令牌在各站點中傳遞,誰拿到令牌,誰就是主站,就可以發布信息。如果本站沒有事情需要發布,就把令牌交給下一個站點,由此解決了匯流排佔用問題。

2)當鏈路發生斷路時,為了避免出現通信中斷,可採用雙主站措施。雙主站(PLC的兩個主站RS485介面)之間用握手線連接,平時主用RS485開通,而輔助RS485浮空。浮空的RS485雖然接在匯流排上,但它處於高阻態等效於完全脫離。當發生斷路時,從站確認後立即開通通信,從鏈路兩頭進行連接通信。

有時,還採取環狀通信措施。限於篇幅,不做介紹。

3)MODBUS可工作在網路層,此時協議變為MODBUS-TCP,但還是符合主從結構。

4)MODBUS協議是美國莫迪康公司發明的,該公司的宗旨是:MODBUS協議為不收費的公開協議。後來莫迪康公司被施耐德公司收購了,施耐德公司繼承了莫迪康公司的做法,MODBUS是不收費的公開協議。既然MODBUS已經成為施耐德的協議,施耐德把它延伸到網路層,構建了網路層的MODBUS-TCP協議,以及內部專用的MODBUS-PLUS協議。限於篇幅,對於這兩個協議的描述此處從略。

5)關於RS232和RS485的區別

學過模電和數電的人都知道差分電路。差分電路具有共模抑制比,能夠消除共模誤差。RS485介面就具有此特徵。因此RS232介面的傳輸距離僅為十幾米,而RS485/RS422介面的傳輸距離為1200米。

我們從圖中看到,雖然RS232和RS485介面的外形是一致的,但它們的性能和信息交換模式不同,因此抗干擾能力也不同。

6)當距離很長的時候,RS485介面還可以接入光纖,但需要配備1對光纖轉換器。之所以要1對,是因為其中一隻用於電轉光,而第二隻則用於光轉電。光纖收發器中間的通信介質就是光纜或者光纖。(注意哦,光纖是光纜的芯線,不要以為是兩種東西)

光纖分為單模和多模。單模的光纖較細,光在傳輸過程中反射較少,因而失真小,其傳輸距離可達15km以上;多模的光纖較粗,光在傳輸過程中反射較多,因而失真大,其傳輸距離為1.5km。

7)CRC校驗碼是二進位不借位的除法,用以做接收信息是否出錯的檢驗。

注意這裡的f(x)就是除去CRC校驗碼的MODBUS通信幀,除數是CRC16。幀中的CRC是運算後的餘數。

主站在發送幀之前,把幀先做CRC計算,再把CRC運算的餘數附在幀尾發送給從站。從站接收到幀後,先對幀除去CRC的部分做CRC運算來檢驗是否正確,若不正確,從站要求主站重發。

同理,當從站發送信息給主站時,主站也根據CRC來檢查數據的正確性。若發現錯誤,則要求從站重發。

8)關於MODBUS-RTU、MODBUS-ASC和MODBUS-TCP

如果MODBUS中位元組表達數據的方式採取BCD碼,則被稱為MODBUS-RTU;如果MODBUS中位元組表達數據的方式採取ASCII碼,則被稱為MODBUS-ASC;如果MODBUS運行在網路層上,則被稱為MODBUS-TCP。

ASCII碼的內容如下:

MODBUS在實際使用中,大多數都採用BCD碼,因此MODBUS-RTU得到廣泛應用。

BCD碼如下:

值得注意的是:在協議使用中,數據幀中的數值都是用16進位數來表達的。例如100A電流寫成0X64H,而380V電壓則寫成0X17CH。

9)關於RS485網路使用的雙絞通信線和接地

我們知道,兩條平行的線纜之間會有分布電容,而分布電容會削弱信號的強度。為了消除分布電容,通信線的兩條平行線需要按一定長度互相旋轉對絞,這種線被稱為雙絞線。雙絞線的對絞長度有規範,它與通信速率密切相關。在實際使用時,要按通信速率來選擇合適的雙絞線。

雙絞線的外層有屏蔽層。屏蔽層必須單點接地,不得在線頭線尾同時接地,防止地電流流過引起干擾。在實際布線時,採取各線段獨立接地,切忌採用所有線段的屏蔽層前後連接統一接地的做法。

10)關於菊花瓣的通信鏈路連接方式

(這一段內容出現在評論里,因為比較重要,我把它改進正文中。)

絕對的菊花瓣鏈形網路是不存在的。事實上,我們用菊花瓣鏈形接線方法構建的通信網路中,各個節點是接線端子,由接線端子通過雙絞線連接到各個子站,這些雙絞線就構成了類似的星形結構,我們不妨把這種接線方式稱為鏈形網路下的準星形接線。

在工程實踐中證明,準星形接線的長度不得超過70cm。一旦超過,則可能出現通信不穩定狀態。

事實上,70cm也成為行業中的一條不成文的質檢規範。

100歐終端電阻在通信速率低時可加可不加,但當通信速率較高時(高於19.2kbps),建議一定要加。例如PROFIBUS下的RS485網路,終端電阻已經植入終端設備中,只需撥動開關即可加入或者撤離。

終端電阻的用途是吸收反射波。

我們在兩棵樹間緊緊地綁上一根繩子,接著敲擊繩子的某一側,我們會看到有傳導波向另一端傳去,並能看到反射波。如果敲擊的頻率適當,則在繩子中間出現波的不動點,這叫做駐波。

對於通信來說,不管是反射波還是駐波,將嚴重影響通信質量。終端電阻用於吸收反射波,並且可提升最終子站的電平水平。

=============

RS485和MODBUS這兩個概念,都需要通過實踐去掌握它們,單單憑著閱讀文本,很難理解和掌握。如果這篇小文能給大家的實踐活動帶來益處,我會感到分外欣慰。

最後,告訴大家參考資料是什麼。其實不用猜也知道,就是莫迪康公司自己編寫的《MODBUS通信協議和編程指南》:

可惜知乎網沒法上傳文檔,因此沒法發給大家。由於此文檔是公開的,網上應當可以下載。


串列口:這是個很模糊的概念,只要是串列通信的通信口都可以叫串列口,比如常說的USB口也是串列口。

RS232,RS485:這是一種通信口的電氣標準,規定了電平,是物理層的規定

Modbus:是一種通信協議,規定了主從雙方傳輸的數據格式和各部分意義,是軟體規定。

比如說,採用Modbus通信,根據協議主機有一段請求數據的報文,這一段報文可以通過RS485埠傳輸,就要符合RS485的電氣標準,也就是01電平必須符合485的電氣標準。當然這一段報文也可通過其他物理層傳輸,如RS232,此時01電平必須符合232的電氣標準。當然這個例子不太恰當,Modbus的物理層通常用的是RS485標準,因為RS232不支持一主多從通信,這個例子主要說明通信協議(軟體規定)和電氣標準(物理層規定)的區別。


在OSI模型中表示的層次不一樣。

RJ45口是物理層的設備。就是俗稱的「水晶頭」。確定了機械特性,包括形狀、尺寸、大小、顏色、固定安裝方式之類的。

RS232,RS485 是物理層協議。規定了傳輸介質,連接介面等機械特性,還規定了傳輸電平的範圍、每種電平表示的具體含義等電氣特性,以及信號的收發機制。這兩者連接電纜和傳輸的電平不一樣,通信的方式也不一樣,RS232是全雙工,RS485是半雙工。

Modbus 是應用層協議。和應用程序介面,規定了傳輸過程中每個位元組或每一位表示的實際功能和含義。

串列口是相對於並口來說的,是一種通信模式的概念。串列口指逐位傳輸,並口是幾位同時傳輸,好比是通過收費站的車,逐個通過一個收費站和同時通過若干個收費站的區別。

什麼協議對應什麼樣的介面。這個在使用上並沒有嚴格的規定,比如Modbus協議,大部分是通過RS485,也可以使用乙太網進行通信,物理設備可以是雙絞線也可以是光纖等。


RJ45介面就比如你的嘴巴和耳朵,是硬體部分。同理,有USB介面,DB9介面,音視頻介面,等等; 有作輸出的,有作輸入的,也有同時做輸入輸出的。

一張嘴只能依次發音,即串列輸出。串列通信方式有很多種,此如SPI,SCI,I2C,I2S,這些都是晶元層的定義。可以把這些高低電平轉換,放大,走物理層的485匯流排或232,甚至可以調製載入到家用工頻線來傳輸,即用電網上網。

你講,他聽著;你講完了,他講你聽……如此反覆;這叫半雙工。

你一邊講,一邊聽; 他也邊講邊聽; 即你們同時講同時聽; 這就是全雙工。

你們可以面對面交談,也可以用手機溝通,聲音分別通過空氣和無線電傳輸,即傳輸介質。傳輸的聲波和無線電波,波的形式不同,232和485的信號形式也不同。形式決定了傳輸距離,速率等。

你們可以說中文,也可以講英語,這就是協議,如Modbus,Profibus。


RS232,RS485是物理層的協議,定義了各線的針腳功能,連接的物理結構。就好像各國對馬路上行車要求左行或右行一樣,規定大家都照著一個規則走。

RJ45是物理介面,俗稱的水晶頭,網口。但並不是要求一定是網路協議,比如有些設備只用了兩個針腳來連接RS485的兩線。這時候雖然是用RJ45,但走的物理協議是485。

MODBUS協議是數據層的協議,打個比方來解釋下和物理層的差別:都是用聲音這種方式來交流,兩人也需要都用同一種語言,聲音是物理層而語言就是數據層。同樣,一種語言可以是聲音也可以是文字,MODBUS也根據在不同物理協議上通訊,可以分成MODBUS-RTU(MODBUS-ASCII)和MODBUS-TCP/IP。

串列口本義是包括所有串列通信在內的所有介面,但國內經常用來特指電腦上的9針RS232介面,也就是DB-9。


1.TTL、RS232、RS422和RS485

對英語學習比較了解的小夥伴肯定會知道,英語到了不同的地方就可能會有不同的口音。比如美式英語、倫敦音、印式英語、日式英語甚至中式英語(霧)。雖然發音方式各有千秋,但是語法、詞法基本相同。這同樣也是串口通訊的特點。「 相同 不同 」對於TTL、RS232、RS422和RS485其實是四種不同的邏輯電平。UART協議工作在鏈路層的一種低速通訊協議,包含了RS232,RS422甚至是紅外(IRDA)等。UART的工作原理是將傳輸數據的每個字元以串列方式一位接一位的傳輸。每次傳輸由起始位、數據位(先低位後高位)、(奇偶校驗位)、停止位。傳輸間隙稱為空閑位。對UART協議還不了解的小夥伴們可以複習一下上周內容喔!

這樣,大家都是說的「UART語」,語法就是UART協議,而不同的邏輯電平就像不同的口音。我們抓她們的住相同點了。接下來就讓我們具體了解一下RS232、RS422、RS485和TTL的不同點1TTLTTL電平(晶體管-晶體管邏輯電平)是大家較為熟悉的。一般用+5V表示邏輯「1」;0V表示邏輯「0」(某些單片機用+3V3或+1V8表示高電平)。

TTL電平邏輯相對簡單,也不需要複雜的驅動器/接收器電路,所以使用相對方便。2RS-232RS-232電平用-3V~-25V,典型值:-13V來表示邏輯「1」;3V~25V,典型值:13V來表示邏輯「0」。

好奇的小夥伴可能會問了,為什麼要用負電壓來表示1,正電壓來表示0呢?使用負邏輯相對可以:1.抗(外界的電磁)干擾2.抗外界的(電磁信號)噪音干擾3.抗(信號的)衰減

使得和同樣的TTL信號相比,RS232信號可以傳輸的更遠。(雖然相對較遠,但是也不超過50m)所以RS-232適合短距離,兩個設備之間的快速通訊。

利用晶元如MAX232可以很方便地實現RS-232與TTL的電平轉換?小知識1RS-232串口最早期由美國電子工業協會(EIA)聯合貝爾系統(Bell System)、數據機廠家及計算機終端生產廠家共同制定的用於串列通訊的標準。它的全名是"數據終端設備(DTE)和數據通訊設備(DCE)之間串列二進位數據交換介面技術標準"該標準規定採用一個25 個腳的DB-25 連接器,對連接器的每個引腳的信號內容加以規定,還對各種信號的電平加以規定。後來IBM的PC 機將RS-232 簡化成了DB-9 連接器,從而成為事實標準。而工業控制的RS-232 口一般只使用RXD、TXD、GND 三條線。在兩條數據線上按照相反的方向傳輸數據,這樣接收和發送可以同時進行,串口制式為「全雙工」。

關於引腳定義的內容了解即可,不用強記

DB-25

?1 GND 屏蔽地

2 TXD 發送數據

3 RXD 接收數據

4 RTS 請求發送

5 CTS 清除發送

6 DSR 數據準備好

7 GND 信號地8 CD 載波偵測

9 發送返回(+)10 未定義11 數據發送(-)

12-17 未定義

18 數據接收(+)19 未定義

20 DTR 數據終端準備

21 未定義

22 RI 振鈴指示

23-24 未定義

25 接收返回(-)DB-9?

1 DCD 載波檢測

2 RXD 接收數據

3 TXD 發送數據

4 DTR 數據終端準備好

5 SG 信號地

6 DSR 數據準備好

7 RTS 請求發送

8 CTS 清除發送

9 RI 振鈴提示 RIRS232的不足也非常的突出:1.介面的信號電平值較高,達到十幾V,容易損壞介面電路的晶元,而且和TTL電平不兼容,因此和單片機電路接起來的話必須加轉換電路。2.傳輸速率有局限,不可以過高,一般到20Kbps就到極限了。3.介面使用信號線和GND與其他設備形成共地模式的通信,這種共地模式傳輸容易產生干擾,並且抗干擾性能也比較弱。4.傳輸距離有限,最多只能通信幾十米。5.通信的時候只能兩點之間進行通信,不能夠實現多機聯網通信。

3RS-485針對RS-232介面的不足,隨著技術的發展,又了很多新的介面標準,RS-485就是其中之一。與RS-232不同,RS-485傳輸差分信號。小知識2什麼是差分信號?

傳統的信號傳輸方式需要一根信號線一根地線,由信號線上的電平來決定邏輯「1」,和邏輯「0」。差分傳輸在這兩根線上都傳輸信號,這兩個信號的振幅相等,相位相反。在這兩根線上傳輸的信號就是差分信號。

信號接收端比較這兩個電壓的差值來判斷發送端發送的是邏輯「0」還是邏輯「1」。RS-485就是一種差分通信方式,它的通信線路是兩根,通常用A和B或者D+和D-來表示。邏輯「1」以兩線之間的電壓差為+(0.2~6)V表示,邏輯「0」以兩線間的電壓差為-(0.2~6)V來表示。在電路板上,差分走線必須是等長、等寬、緊密靠近、且在同一層面的兩根線。

RS-485介面的優點主要有:

1.通信速度快,最大傳輸速度可以達到10Mbps以上。2.RS-485內部的物理結構,採用的是平衡驅動器和差分接收器的組合,抗干擾能力也大大增加。3.傳輸距離最遠可以達到1200米左右,但是她的傳輸速率和傳輸距離是成反比的,只有在100Kbps以下的傳輸速度,才能達到最大的通信距離,如果需要傳輸更遠距離可以使用中繼。4.可以在匯流排上進行聯網實現多機通信,匯流排上允許掛多個收發器,從現有的RS-485晶元來看,有可以掛32、64、128、256等不同個設備的驅動器。

MAX485可以提供便捷的TTL-RS485轉換方案。?需要注意的是差分信號由兩條數據線的電壓差來獲得數據信息,要是兩個設備同時「說話」,就一定會互相干擾,誰也聽不清楚另一個在說什麼。因此兩根數據線接收和發送不能同時進行,只能分時進行。這樣的串口制式被稱作「半雙工」。

MAX485僅支持「雙線半雙工」。晶元的2腳是低電平使能接收器,3腳是高電平使能輸出驅動器。因此我們可以把他們連起來接入單片機IO口。平時不發送數據的時候,保持這兩個引腳是低電平,讓MAX485處於接收狀態,當需要發送數據的時候,把這個引腳拉高,發送數據,發送完畢後再拉低這個引腳就可以了。4

RS-442

RS-422 的電氣性能與RS-485完全一樣。主要的區別在於:RS-422 有4 根信號線:兩根發送(Y、Z)、兩根接收(A、B)。由於RS-422 的收與發是分開的所以可以同時收和發(全雙工)。

RS-485 有2 根信號線:發送和接收都是A 和B。由於RS-485 的收與發是共用兩根線所以不能夠同時收和發(半雙工)。

2.串口就在我們身邊看了那麼多五花八門的電平規範和介面電路,可能有點小夥伴會說:「天哪!難道我還要自己焊電路?串口真難!」但是,串口真的就在我們身邊。傳統的9針串口介面正在慢慢從個人電腦的後面板中消失,取而代之的是速度更高的USB介面。所以我們有了USB-TTL!?

3.串口到底是怎樣實現的為了讓大家充分理解UART串口通信的原理,和波特率、起始位、停止位這些基本概念,我們先來學習如何用軟體模擬UART串口通信。複習一下上周學習的概念波特率波特率就是發送一位二進位數據的速率,習慣上用baud表示,我們發送一位數據的持續時間=1/baud。在通信之前,兩台設備首先都要明確的約定好他們之間的通信波特率,必須保持一致,收發雙方才能正常實現通信。通信時序?

按照時域圖,在UART串口在空閑狀態下保持高電平。數據從低位到高位一依次傳輸。所以在接收時,如果檢測到RXD出現低電平,可以認為是數據的開始。第10位為高電平可以認為是數據傳輸完成。

4.我告訴電腦,電腦怎樣告訴我??

使用STC-ISP下載軟體可以實現串口助手功能。主要配置用藍框圈出。具體如何配置,我們結合程序來看看。

5.寫一個軟體模擬串口的程序程序的思路如下:

?在ConfigUART() 中配置定時器,用定時器方式2,8位初值自動重裝的8位定時器。TLX溢出後再TRX置1,申請中斷同時THX的值裝載到TLX中。

接收數據的時候,首先要進行低電平檢測 while (Port_RXD),若沒有低電平則說明沒有數據,一旦檢測到低電平,就進入啟動接收函數StartRXD()。接收函數最開始啟動半個波特率周期。因為我們希望在信號最穩定的時候去讀數據。除了信號變化的那個沿的位置外,其他位置都很穩定,那麼我們現在就約定在信號中間位置去讀取電平狀態,這樣能夠保證我們信號讀的是對的。

一旦讀到了起始信號,我們就把當前狀態設定成接受狀態,並且打開定時器中斷,第一次是半個周期進入中斷後,對起始位進行二次判斷一下,確認一下起始位是低電平,而不是一個干擾信號。以後每經過9600分之一秒進入一次中斷,並且把這個引腳的狀態讀到RxdBuf裡邊。等待接收完畢之後,我們再把這個RxdBuf加1,再通過TXD引腳發送出去,同樣需要先發一位起始位,然後發8個數據位,再發中止位,發送完畢後,程序運行到while (Port_RXD),等待第二輪信號接收的開始。

源文件軟體模擬UART串口通信#include #define uchar unsigned char#define uint unsigned int

//注意晶振頻率根據自己的實際頻率設定/***********************************************/#define CLK 22118400 //晶振頻率/***********************************************/

sbit Port_RXD = P3^0; //接收引腳定義sbit Port_TXD = P3^1; //發送引腳定義

bit RxdOrTxd = 0; //指示當前狀態為接收還是發送bit RxdEnd = 0; //接收結束標誌bit TxdEnd = 0; //發送結束標誌uchar RxdBuf = 0; //接收緩衝器uchar TxdBuf = 0; //發送緩衝器

void ConfigUART(unsigned int baud);void StartTXD(unsigned char dat);void StartRXD();

void main (){ConfigUART(9600); //配置波特率為9600EA = 1; //開總中斷

while(1){while (Port_RXD); //等待接收引腳出現低電平,即起始位StartRXD(); //啟動接收while (!RxdEnd); //等待接收完成StartTXD(RxdBuf+1); //接收到的數據+1後,發送回去while (!TxdEnd); //等待發送完成}}

void ConfigUART(uint baud) //串口配置函數,baud為波特率{TMOD = 0xF0; //清零T0的控制位TMOD |= 0x02; //配置T0為模式2TH0 = 256 - (CLK/12) / baud; //計算T0重載值}

void StartRXD() //啟動串列接收{TL0 = 256 - ((256-TH0) &>&> 1); //接收啟動時的T0定時為半個波特率周期ET0 = 1; //使能T0中斷TR0 = 1; //啟動T0RxdEnd = 0; //清零接收結束標誌RxdOrTxd = 0; //設置當前狀態為接收}

void StartTXD(unsigned char dat) //啟動串列發送,dat為待發送位元組數據{TxdBuf = dat; //待發送數據保存到發送緩衝器TL0 = TH0; //T0計數初值為重載值ET0 = 1; //使能T0中斷TR0 = 1; //啟動T0Port_TXD = 0; //發送起始位TxdEnd = 0; //清零發送結束標誌RxdOrTxd = 1; //設置當前狀態為發送}

void InterruptTimer0() interrupt 1 //T0中斷服務函數,處理串列發送和接收{static uchar flag = 0; //記錄當前正在處理的位

if (RxdOrTxd) //串列發送處理{flag++;if (flag &>= 1;}else if (flag == 9) //發送停止位{Port_TXD = 1;}else //發送結束{flag = 0; //複位bit計數器TR0 = 0; //關閉T0TxdEnd = 1; //置發送結束標誌}}else //串列接收處理{if (flag == 0) //處理起始位{if (!Port_RXD) //起始位為0時,清零接收緩衝器,準備接收數據位{RxdBuf = 0;flag++;}else //起始位不為0時,中止接收{TR0 = 0; //關閉T0}}else if (flag &>= 1; //低位在先,所以將之前接收的位向右移if (Port_RXD) //接收腳為1時,緩衝器最高位置1;為0時不處理即仍保持移位後的0{RxdBuf |= 0x80;}flag++;}else //停止位處理{flag = 0; //複位bit計數器TR0 = 0; //關閉T0if (Port_RXD) //停止位為1時,方能認為數據有效{RxdEnd = 1; //置接收結束標誌}}}}

感興趣的小夥伴可以把這些代碼複製到自己的Keil中燒錄到單片機里,結合實驗現象和注釋加深體會。

6.程序效果?

串口小助手選擇波特率9600,校驗位為無校驗,停止位為1位。接下來打開串口,發送一組16進位數,即可收到單片機+1後回傳的結果。雙向通訊正常,實驗成功。


串列口:一種物理傳輸設備(例如電纜或光纖),傳輸內容二進位0和1。

RJ45口:一種插頭(有點像電話線和網線),用於連接電纜和設備。

RS232:一種通過電纜傳遞數據的方式,其中RS232通過高低電平傳送數據,當導線的信號電壓為0.5v到+12v時代表二進位1,-0.5v到-12v時代表0,tx線發送數據,rx線接收數據,還有若干其他信號線用於增強功能,通常是9針接頭連接。

RS485:一種通過電纜傳遞數據的方式,使用差分信號傳送數據,有兩根信號線A、B線,其中AB之間電壓大於0.2v時代表二進位1,小於-0.2v時代表二進位0,通常使用二芯雙絞線加端子連接。

Modbus協議:前面的RS232/RS485隻是提供了物理上傳遞二進位數據的方式,如果要訪問設備數據,還需要應用層的協議,來表達諸如:【我要讀取1號表內存地址01的1個位元組數據】這樣的命令,Modbus協議描述了一套表達數據訪問的命令規範。例如命令01 03 0020 0001 xxxx 代表向地址01的設備讀取(03)內存起始地址為0x0020開始的0x0001個位元組的數據,CRC校驗位元組為xxxx。


串口:是一種通訊方式,常用的有RS-232,RS-485。標準的是9針頭,但為了方便也有用壓線和RJ45的介面。說白了低速下能連通就可以用。高速下不按標準影響通訊。

RJ45是乙太網的標準,但網線、水晶頭、網線鉗、測試工具都很好買,所以很多時候把他當8線的連接頭來用。

Modbus是常用的通訊協議,其實分 Modbus-RTU 和Modbus-ASCII,我們常用的是前者。後來有發展出在網路上用的 Modbus/TCP。

下面是我以前寫的通訊基礎知識,放在百度文庫供參考。

http://r.m.baidu.com/i2doiuc


232是電平信號全雙工。

485是差分信號半雙工。

modbus是通信協議。(基於232/485/tcpip)


串口通信就是232,只有兩根線txd和rxd,雙方必須設定相同的波特率,傳輸距離比較近。 I2C號稱是最簡單的串列通訊協議,只需要一根數據線一根時鐘線就可以完成半雙[圖片]工通訊。一根是雙向的數據線SDA,另一根是時鐘線SCL。I2C協議:

1.誰主動發起數據請求(讀/寫)誰就是主機。

2.主機提供時鐘。

3.SCL為高電平時,SDA從高到低跳變表示起始條件,從低到高跳變表示結束條件。數據傳輸過程中SDA表示的數據的跳變只能發生在SCL為低電平的時候。

4.主機發送起始條件後,發送的第一個位元組是從機地址(7bit)+讀寫指示(1bit),從機在SDA上產生1bit的ACK。

5.第一個位元組的傳輸至此結束。以後的位元組傳輸也是發送方發送一個8bit數據,接收方發一個1bit的ACK。至於是主機發送數據還是從機發送就看讀寫指示位。

6.數據傳輸結束後主機發送停止條件。

7.主機發送停止條件之前,如果主機是接收方需要回應,則主機發NACK。為什麼不是ACK,這個還需要再想想。


不請自來。rs232是點對點

Rs485是令牌輪詢

Rj45是乙太網 走的是tcp/ip


大家見面握手方式不同,都是介面協議


東西不錯,過於零零碎碎了,不好系統學習。

其實,modbus雖然比較簡單,但是如果不注意有很多坑, 特別是寄存器的位數,大小端處理,浮點數,長整數的處理等等。 目前也沒有什麼合適的書籍系統介紹,幫助理解的。

剛剛搜了一下,只有最近清華出版的《Modbus軟體開發實戰指南》不錯, 應該是Modbus開發方面第一書,很系統很全面,各種代碼都是開源的。 內容著重講述如何快速入門並精通Modbus軟體開發技術, 適用於初學Modbus通信協議的讀者,京東淘寶都有吧,可以看看。


推薦閱讀:

TAG:信息技術IT | 電氣工程 | 通訊協議 |