1、串行通訊只有一個(gè)傳輸通道,每個(gè)時(shí)刻只能表達(dá)一種狀態(tài)。不管什么介質(zhì),不管是什么信號,我們用1表示一種狀態(tài),用0表示另一種狀態(tài)。
2、只用1和0兩種狀態(tài),是不能表達(dá)更多信息的。好在有一個(gè)物理量,對每個(gè)系統(tǒng)來講是統(tǒng)一的,那就是時(shí)間。我們現(xiàn)在很容易做到不同系統(tǒng)之間的定時(shí)誤差控制在ppm數(shù)量級。1和0在時(shí)間上進(jìn)行有序的組合,就可表達(dá)近乎無限的信息。
3、任何一個(gè)信號,如果不賦給它一些特點(diǎn)的意義,實(shí)際上沒什么用。兩個(gè)系統(tǒng)要通過信號交換信息,必須對信號有一個(gè)共同的約定,這就是我們通常所說的協(xié)議。
4、最基本的協(xié)議是物理層面的(那個(gè)osi的七層協(xié)議模型,第一層就是物理層協(xié)議)。rs232、rs485、rs422,這些是物理層面的一些協(xié)議。
5、我們現(xiàn)在要談的是異步串行通訊。異步,發(fā)達(dá)方和接收方之間,沒有額外的通道來傳送信息何時(shí)傳送與接收。每個(gè)信息單元的起止時(shí)間,發(fā)送方編在信息中,由接收方自已解碼并同步。
6、好?,F(xiàn)在來講一下傳送一個(gè)字節(jié)的過程。在沒有傳送信息時(shí),傳輸線處于空閑狀態(tài)。規(guī)定:空閑狀態(tài)為1。發(fā)送方(tx)準(zhǔn)備發(fā)送,驅(qū)動(dòng)傳輸線讓它由1變?yōu)?,并持一位的時(shí)間長度,我們把這一位叫做起始位。接收方(rx),檢測到傳輸線由1變0,意味著可能有信息要傳了,rx就持續(xù)檢測,以驗(yàn)證這個(gè)0是不是持續(xù)了規(guī)定的一位時(shí)間長度,若是個(gè)合法的起始位,就按約定的定時(shí)方式,把后續(xù)的傳輸線狀態(tài),接收為1個(gè)字節(jié)。tx在發(fā)完起始位后,就發(fā)字節(jié)中的第一個(gè)位(bit),并依次把字節(jié)中的所有位發(fā)完,每bit均持續(xù)相同的一位時(shí)長。然后再發(fā)校驗(yàn)位(如果約定發(fā)/收方都采用的話)、停止位。
7、停止位,這個(gè)要說一下。我們知道起始位是0,而這個(gè)停止位,規(guī)定是1,和傳輸線的空閑狀態(tài)1是相同的。停止位規(guī)定的時(shí)長比較亂,有1位停止位(也就持續(xù)時(shí)間占1個(gè)位長)、1.5位、和2位停止位,其它時(shí)長的停止位好象沒見過。停止位的作用,其一是作為一字節(jié)單元的成員,給接收方定時(shí)用的,也就是下一個(gè)字節(jié),在停止位之后才開始。另一個(gè)作用,可供檢查字節(jié)傳送的完整性。因?yàn)橥V刮皇且?guī)定為1狀態(tài)的,若在停止位的時(shí)間里測到了非1狀態(tài),表示這個(gè)字節(jié)傳送有問題,有可能被接收方丟棄,傳送失敗。
8、若收發(fā)雙方的停止位不相同,怎么辦?這個(gè)在論壇上經(jīng)常有人問。好,我們來分析一下。若tx是2個(gè)停止位,rx要求是1個(gè)停止位,很好,tx多發(fā)的一個(gè)停止位,會(huì)被rx看作是空閑狀態(tài)(也可認(rèn)為是字符間隔),沒有任何問題。若反過來,tx是1個(gè)停止位,rx要求是2個(gè)停止位,有問題嗎?一般問題是很大的,但也有可能可以正常通訊。這要看tx是怎么發(fā)字節(jié)的。有些系統(tǒng),硬件上,發(fā)送電路比較簡單,沒有緩沖機(jī)構(gòu),一個(gè)字節(jié)必須完整發(fā)送后,才準(zhǔn)備下一個(gè)字節(jié)的數(shù)據(jù),而這個(gè)準(zhǔn)備需要花一些時(shí)間的,這就給傳送的時(shí)序上,停止位之后,有了空閑時(shí)間,相當(dāng)于停止位得到了延長。所以我曾經(jīng)發(fā)過一個(gè)貼子說,s7200的發(fā)送改為單字節(jié)發(fā)送,每個(gè)字節(jié)之間有意插入一些延時(shí),人為造成空閑時(shí)間,以充當(dāng)停止位,但這個(gè)方法說歸說,我并沒有試過。可惜的是,現(xiàn)在的系統(tǒng),硬件都做得很完美了,包括s7200,tx是有緩沖的,在一個(gè)字節(jié)還未發(fā)完前就可以接受下一個(gè)要發(fā)送的字節(jié),硬件上保證一個(gè)字節(jié)發(fā)完后可以立即啟動(dòng)下一個(gè)字節(jié)發(fā)送,前后兩字節(jié)間除了停止位,沒有額外的間隙,這種情況下,接收方就要命了,rx認(rèn)為還在收停止位時(shí),下一個(gè)字節(jié)的起始位就來了,沒辦法完整接收,通訊就失敗了。
9、波特率。兩邊設(shè)為一致就可以了。波特率不一致,鐵定不能通訊。但允許有少量的誤差。停止位實(shí)際上還用來調(diào)節(jié)這個(gè)誤差的。比如1個(gè)停止位,rx并不死板要求停止位是完整的1個(gè)位時(shí)長,實(shí)際只要停止位超過0.5個(gè)位長就算是合格了。波特率,就是每秒最快能傳送的位數(shù),包括了起始位、停止位這些輔助位。實(shí)際每秒能傳送的最快字節(jié)數(shù),要看這些輔助位的多少。比如一個(gè)11位結(jié)構(gòu)的字節(jié)單元:1起始位+8字節(jié)位+1校驗(yàn)位+1停止位,字節(jié)最快傳送速率為band/11。好象還有一個(gè)概念,叫比特率,也就是有效的位傳送速率,比特率=8*(band/11),也就是比特率比波特率要小的。
10、rs232的tx和rx是兩根獨(dú)立的線,收/發(fā)可以同時(shí)進(jìn)行,所以叫作全雙工異步串行通訊。按我們?nèi)粘扇私徽劦慕?jīng)驗(yàn),總是a說b聽,當(dāng)b要說時(shí),a就停下來聽b說。如果a、b同時(shí)說,這是吵架,要達(dá)到相互交流就難了。同樣,通訊若同時(shí)收發(fā),一般人會(huì)白白死掉很多腦細(xì)胞而寫出的程序通訊效果還是很差。所以,即使rs232能雙向同時(shí),
一般使用時(shí)也是收、發(fā)不同時(shí)的。
11、rs485。rs232不錯(cuò)了,但局限性大大的。rs485收發(fā)同線,允許多少rs485并聯(lián)使用,電氣采用差分傳送信號,可以抗干擾。s7200就屬于rs485。rs485設(shè)備同一時(shí)間只能發(fā)或再改,收發(fā)是分時(shí)的,所以叫做準(zhǔn)雙向。盡管s7200中可以同時(shí)緩沖8個(gè)netr和netw,實(shí)際在rs485層面,還是一個(gè)一個(gè)分時(shí)完成的(由系統(tǒng)程序根據(jù)ppi協(xié)議協(xié)調(diào))。rcv和xmt完全由用戶程序控制,你就不能同時(shí)讓兩個(gè)都執(zhí)行,否則就是哄搶資源而被s7200當(dāng)成錯(cuò)誤處理。
12、rs422,介于rs232和rs485。rs422和rs232一樣收、發(fā)線獨(dú)立,但電氣上采用和rs485一樣的差分信號。所以rs422能多機(jī)通訊,比rs232傳得遠(yuǎn),但比rs485浪費(fèi)硬件資源。rs422只要軟件上采用準(zhǔn)雙向的規(guī)則,通過發(fā)收線合并,可以簡化為rs485,和rs485設(shè)備通訊。但rs485卻不能復(fù)雜化成rs422使用。