田 賽
(寶雞職業技術學院 電子信息工程系,陜西 寶雞721000)
串口通信協議用于完成雙機互聯程序的文件傳輸功能, 簡稱SPCP。 設計思想基于幀傳輸方式,即在向串口發送數據時是一幀一幀地發送。 為了保證可靠傳輸,通過握手建立連接,在每一幀的傳輸中,采用發送/應答/重連/失敗方式。所謂通信協議是指通信雙方的一種約定。約定包括對數據格式、同步方式、傳送速度、傳送步驟、檢糾錯方式以及控制字符定義等問題做出統一規定,通信雙方必須共同遵守。 它屬于OSI 七層參考模型中的數據鏈路層。 由于RS-232 標準只是一個接門標準,它規定了連接電纜、機械、電氣特性、信號功能及傳送過程等,因此,在OSI 七層(包括 應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層)參考模型中只代表了物理層(Physical Layer)和數據鏈路層(Data Link Layer),如果想實現數據的雙向訪問,使通信雙方能夠按規定的格式從串口發送數據,同時也能從接收到的數據中將需要的信息提取出來,就需要設計用戶通信協議,以進行數據處理。而用戶層協議則是面向使用者的,這種用戶層通信協議簡單地講就是對數據格式、同步方式、傳送速度、傳送步驟、數據校驗、檢糾錯方式等問題做出統一規定,通信雙方必須共同遵守。
在通信過程中的幀,按其功能的不同,分為數據幀、控制幀和短語幀三種。數據幀用于傳遞用戶所需傳遞的信息(文件),數據幀中的數據最終會被程序解讀并重組;而控制幀則用于實現在通信過程中的控制信息的交換,以順利實現數據幀的傳輸;短語幀用于文本消息的發送。每一幀分為幀頭和負載兩個部分,其中幀頭占6 個字節,前2 個字節用于區分三種幀,后4 個字節對于不同幀的意義各不相同,負載長度不定。

表1 三種幀結構
數據幀包括幀頭、 負載數據和校驗和。 幀頭長8 個字節, 其中,Source 表示發出本幀的機器的編號;Destination 表示本幀欲發送到的目的機的編號;Count 表示負載數據的長度(字節計數),Count 則是程序運行中根據輸出緩沖區大小而定的, 最多不超過輸出緩沖區的一半;Checksum 表示將前面從Byte0 到Byte5 所有的數據進行校驗和計算后得到的結果。
控制幀與控制信號合作完成通信同步與控制任務, 只有幀頭,沒有負載數據,幀頭長8 個字節,其中nPack 表示本次傳輸共發送的幀數,以便讓接收端控制進度。 當nPack=Checksum=0 時,表示本次傳輸結束,當接收端收到該幀時,不管是否已收到應接收的幀數,都將結束此次傳輸(記該幀為ABORT 幀)。 在沒有發生傳輸錯誤的情況下,一次傳輸只會出現兩次控制幀,第一次在傳輸開始時(記為控制首幀),第二次則在傳輸結束時出現。
短語幀的組成與數據幀十分相似, 前兩字節分別為0x01 和0x00,其后的字節則用于承載所要發送的文本數據,短語幀的最后兩個字節仍然為對本幀前面所有字節的校驗和計算后的值。
應用程序發送來的數據作為一個流按協議進行分幀,切割后為每幀加上幀頭和校驗和進行發送;在接收端,分幀的數據去掉幀頭后存入文件緩沖區,接收完成后寫入磁盤。
在數據傳輸時,主要有三種方案可供選擇,即有確認的面向連接的服務;有確認的無連接的服務;無確認的無連接服務。 有確認的面向連接服務在源機器與目的機器在傳遞任何數據之前,都先建立一條連接。 在這條連接上所發送的每一幀都被編上號,數據鏈路層保證所發送的每一幀都確實已收到。與此同時,它保證每幀只收到一次,且所有的幀都是按正確的順序收到的,但是這種連接方式系統開銷較大。 大多數廣域網的通信子網的數據鏈路層采用面向連接確認服務。無確認的無連接服務是源機器向目的機器發送獨立的幀,而目的機器對收到的幀不作確認。事先沒有建立連接,事后也不存在釋放。如果由于線路上的原因造成某一幀的數據丟失,則數據鏈路層并不會檢測到這樣的丟失幀,也不會恢復這些幀。 錯誤率較高。 當然在錯誤率很低,或者對數據的完整性要求不高的情況下(如話音數據),這樣的服務還是非常有用的,因為這樣簡單的錯誤可以交給OSI 上面的各層來恢復。 如大多數局域網在數據鏈路層所采用的服務也是無確認的無連接服務。有確認的無連接服務是對無確認的無連接服務的一種改進。當提供這種服務時,仍然不建立連接,但是所發送的每一幀都進行單獨確認。以這種方式,發送方就會知道幀是否安全地到達,如果在某個確定的時間間隔內,幀沒有到達,就必須重新發送此幀。這類服務主要用于不可靠信道,如無線通信系統。
在發送數據前,發送方將數據進行分幀包裝,然后按發送請求、數據傳輸、發送完成的步驟進行通信。接收端收到請求信號后,向用戶詢問是否接收。用戶確認接收后,接收端發出“請求發送文件”信號。發送端收到“請求發送文件”信號后,開始發送數據。 首先由發送端發出第一幀數據,然后等待反饋。接收端收到一幀數據后,若幀長度校驗和錯誤則發出“請求重新發送幀數據”信號,如果正確,則發出“請求發送下一幀數據”信號。若發送端收到“請求重新發送幀數據”信號,則重新發送先前發送的幀數據。 若發送端收到“請求發送下一幀數據”信號,則首先檢查已經發出的一幀數據是否是最后一幀,如果是則發出“發送完畢”信號,否則,發送下一幀數據。 重復整個過程。 當發送方發出“發送完畢”信號后,關閉文件,并提示用戶“發送完畢”。接收端受到“發送完畢”信號后,則把文件緩沖區中存儲的數據寫入磁盤,然后關閉文件,并向用戶提示“接收完畢”。
從上面的分析可以看出,基于有確認的無連接服務的串口通信幀同步方法是本文中提出的三種幀方法中最優的,結構清晰且系統資源利用率高。串口數據傳輸時在每一幀都采用了發送/應答/重連/失敗的方式進行。 克服了數據幀傳輸在RS-232 接口中低速率、無線信道不可靠性以及整個通信系統的開銷等制約因素。 需要指出的是本協議仍有一些不完善的地方,比如安全性沒有考慮等,這些不足都有待于以后進一步的優化。
[1]陳啟美,李嘉.現代數據通信教程[M].南京:南京大學出版社,2000,3.
[2]王達.網絡工程師必讀:網絡工程基礎[M].北京:電子工業出版社,2006,7.