田 賽
(寶雞職業(yè)技術(shù)學院 電子信息工程系,陜西 寶雞721000)
串口通信協(xié)議用于完成雙機互聯(lián)程序的文件傳輸功能, 簡稱SPCP。 設(shè)計思想基于幀傳輸方式,即在向串口發(fā)送數(shù)據(jù)時是一幀一幀地發(fā)送。 為了保證可靠傳輸,通過握手建立連接,在每一幀的傳輸中,采用發(fā)送/應答/重連/失敗方式。所謂通信協(xié)議是指通信雙方的一種約定。約定包括對數(shù)據(jù)格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字符定義等問題做出統(tǒng)一規(guī)定,通信雙方必須共同遵守。 它屬于OSI 七層參考模型中的數(shù)據(jù)鏈路層。 由于RS-232 標準只是一個接門標準,它規(guī)定了連接電纜、機械、電氣特性、信號功能及傳送過程等,因此,在OSI 七層(包括 應用層、表示層、會話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層)參考模型中只代表了物理層(Physical Layer)和數(shù)據(jù)鏈路層(Data Link Layer),如果想實現(xiàn)數(shù)據(jù)的雙向訪問,使通信雙方能夠按規(guī)定的格式從串口發(fā)送數(shù)據(jù),同時也能從接收到的數(shù)據(jù)中將需要的信息提取出來,就需要設(shè)計用戶通信協(xié)議,以進行數(shù)據(jù)處理。而用戶層協(xié)議則是面向使用者的,這種用戶層通信協(xié)議簡單地講就是對數(shù)據(jù)格式、同步方式、傳送速度、傳送步驟、數(shù)據(jù)校驗、檢糾錯方式等問題做出統(tǒng)一規(guī)定,通信雙方必須共同遵守。
在通信過程中的幀,按其功能的不同,分為數(shù)據(jù)幀、控制幀和短語幀三種。數(shù)據(jù)幀用于傳遞用戶所需傳遞的信息(文件),數(shù)據(jù)幀中的數(shù)據(jù)最終會被程序解讀并重組;而控制幀則用于實現(xiàn)在通信過程中的控制信息的交換,以順利實現(xiàn)數(shù)據(jù)幀的傳輸;短語幀用于文本消息的發(fā)送。每一幀分為幀頭和負載兩個部分,其中幀頭占6 個字節(jié),前2 個字節(jié)用于區(qū)分三種幀,后4 個字節(jié)對于不同幀的意義各不相同,負載長度不定。
表1 三種幀結(jié)構(gòu)
數(shù)據(jù)幀包括幀頭、 負載數(shù)據(jù)和校驗和。 幀頭長8 個字節(jié), 其中,Source 表示發(fā)出本幀的機器的編號;Destination 表示本幀欲發(fā)送到的目的機的編號;Count 表示負載數(shù)據(jù)的長度(字節(jié)計數(shù)),Count 則是程序運行中根據(jù)輸出緩沖區(qū)大小而定的, 最多不超過輸出緩沖區(qū)的一半;Checksum 表示將前面從Byte0 到Byte5 所有的數(shù)據(jù)進行校驗和計算后得到的結(jié)果。
控制幀與控制信號合作完成通信同步與控制任務, 只有幀頭,沒有負載數(shù)據(jù),幀頭長8 個字節(jié),其中nPack 表示本次傳輸共發(fā)送的幀數(shù),以便讓接收端控制進度。 當nPack=Checksum=0 時,表示本次傳輸結(jié)束,當接收端收到該幀時,不管是否已收到應接收的幀數(shù),都將結(jié)束此次傳輸(記該幀為ABORT 幀)。 在沒有發(fā)生傳輸錯誤的情況下,一次傳輸只會出現(xiàn)兩次控制幀,第一次在傳輸開始時(記為控制首幀),第二次則在傳輸結(jié)束時出現(xiàn)。
短語幀的組成與數(shù)據(jù)幀十分相似, 前兩字節(jié)分別為0x01 和0x00,其后的字節(jié)則用于承載所要發(fā)送的文本數(shù)據(jù),短語幀的最后兩個字節(jié)仍然為對本幀前面所有字節(jié)的校驗和計算后的值。
應用程序發(fā)送來的數(shù)據(jù)作為一個流按協(xié)議進行分幀,切割后為每幀加上幀頭和校驗和進行發(fā)送;在接收端,分幀的數(shù)據(jù)去掉幀頭后存入文件緩沖區(qū),接收完成后寫入磁盤。
在數(shù)據(jù)傳輸時,主要有三種方案可供選擇,即有確認的面向連接的服務;有確認的無連接的服務;無確認的無連接服務。 有確認的面向連接服務在源機器與目的機器在傳遞任何數(shù)據(jù)之前,都先建立一條連接。 在這條連接上所發(fā)送的每一幀都被編上號,數(shù)據(jù)鏈路層保證所發(fā)送的每一幀都確實已收到。與此同時,它保證每幀只收到一次,且所有的幀都是按正確的順序收到的,但是這種連接方式系統(tǒng)開銷較大。 大多數(shù)廣域網(wǎng)的通信子網(wǎng)的數(shù)據(jù)鏈路層采用面向連接確認服務。無確認的無連接服務是源機器向目的機器發(fā)送獨立的幀,而目的機器對收到的幀不作確認。事先沒有建立連接,事后也不存在釋放。如果由于線路上的原因造成某一幀的數(shù)據(jù)丟失,則數(shù)據(jù)鏈路層并不會檢測到這樣的丟失幀,也不會恢復這些幀。 錯誤率較高。 當然在錯誤率很低,或者對數(shù)據(jù)的完整性要求不高的情況下(如話音數(shù)據(jù)),這樣的服務還是非常有用的,因為這樣簡單的錯誤可以交給OSI 上面的各層來恢復。 如大多數(shù)局域網(wǎng)在數(shù)據(jù)鏈路層所采用的服務也是無確認的無連接服務。有確認的無連接服務是對無確認的無連接服務的一種改進。當提供這種服務時,仍然不建立連接,但是所發(fā)送的每一幀都進行單獨確認。以這種方式,發(fā)送方就會知道幀是否安全地到達,如果在某個確定的時間間隔內(nèi),幀沒有到達,就必須重新發(fā)送此幀。這類服務主要用于不可靠信道,如無線通信系統(tǒng)。
在發(fā)送數(shù)據(jù)前,發(fā)送方將數(shù)據(jù)進行分幀包裝,然后按發(fā)送請求、數(shù)據(jù)傳輸、發(fā)送完成的步驟進行通信。接收端收到請求信號后,向用戶詢問是否接收。用戶確認接收后,接收端發(fā)出“請求發(fā)送文件”信號。發(fā)送端收到“請求發(fā)送文件”信號后,開始發(fā)送數(shù)據(jù)。 首先由發(fā)送端發(fā)出第一幀數(shù)據(jù),然后等待反饋。接收端收到一幀數(shù)據(jù)后,若幀長度校驗和錯誤則發(fā)出“請求重新發(fā)送幀數(shù)據(jù)”信號,如果正確,則發(fā)出“請求發(fā)送下一幀數(shù)據(jù)”信號。若發(fā)送端收到“請求重新發(fā)送幀數(shù)據(jù)”信號,則重新發(fā)送先前發(fā)送的幀數(shù)據(jù)。 若發(fā)送端收到“請求發(fā)送下一幀數(shù)據(jù)”信號,則首先檢查已經(jīng)發(fā)出的一幀數(shù)據(jù)是否是最后一幀,如果是則發(fā)出“發(fā)送完畢”信號,否則,發(fā)送下一幀數(shù)據(jù)。 重復整個過程。 當發(fā)送方發(fā)出“發(fā)送完畢”信號后,關(guān)閉文件,并提示用戶“發(fā)送完畢”。接收端受到“發(fā)送完畢”信號后,則把文件緩沖區(qū)中存儲的數(shù)據(jù)寫入磁盤,然后關(guān)閉文件,并向用戶提示“接收完畢”。
從上面的分析可以看出,基于有確認的無連接服務的串口通信幀同步方法是本文中提出的三種幀方法中最優(yōu)的,結(jié)構(gòu)清晰且系統(tǒng)資源利用率高。串口數(shù)據(jù)傳輸時在每一幀都采用了發(fā)送/應答/重連/失敗的方式進行。 克服了數(shù)據(jù)幀傳輸在RS-232 接口中低速率、無線信道不可靠性以及整個通信系統(tǒng)的開銷等制約因素。 需要指出的是本協(xié)議仍有一些不完善的地方,比如安全性沒有考慮等,這些不足都有待于以后進一步的優(yōu)化。
[1]陳啟美,李嘉.現(xiàn)代數(shù)據(jù)通信教程[M].南京:南京大學出版社,2000,3.
[2]王達.網(wǎng)絡(luò)工程師必讀:網(wǎng)絡(luò)工程基礎(chǔ)[M].北京:電子工業(yè)出版社,2006,7.