摘 要: 為了提高串口數(shù)據(jù)通信的準確率,、方便上層應用編程,設計了一個協(xié)議對串口數(shù)據(jù)通信協(xié)議進行封裝,。協(xié)議采用自定義報文格式封裝串口數(shù)據(jù)幀的方式工作,,利用報文應答機制保證傳輸正確性,該協(xié)議在線路故障出現(xiàn)時能有效檢測并采取報文重發(fā)等措施保證數(shù)據(jù)準確傳輸,。
關鍵詞: 串口,;通信協(xié)議;數(shù)據(jù)報,;數(shù)據(jù)傳輸
0 引言
串口通信協(xié)議是計算機上非常通用的一種設備通信協(xié)議,,串口按位(bit)發(fā)送和接收字節(jié),可以在使用一根線發(fā)送數(shù)據(jù)的同時用另一根線接收數(shù)據(jù)[1],。利用串口進行數(shù)據(jù)傳輸時,,串口能做到奇偶校驗以確定數(shù)據(jù)是否傳輸正確,然而在實際的上位機和下位機的通信中,,往往傳輸以字節(jié)為單位的數(shù)據(jù),,這樣僅奇偶校驗數(shù)據(jù)位并不能達到正確傳輸數(shù)據(jù)的目的[2],因此需要建立在串口之上的數(shù)據(jù)交換規(guī)則,即封裝串口通信的協(xié)議[3],。本文設計的就是一種用數(shù)據(jù)報封裝了串口數(shù)據(jù)通信的協(xié)議,,它能有效檢測線路狀態(tài)并處理丟包等問題。它不僅能實現(xiàn)PC之間的數(shù)據(jù)傳輸,,還可用于嵌入式設備的數(shù)據(jù)通信,。
1 協(xié)議分層結(jié)構(gòu)
為了使協(xié)議程序的設計更為合理,并且利于在各硬件系統(tǒng)使用,,將此協(xié)議進行分層設計,。由于串口通信的性質(zhì),無需過多采用面向連接來建立虛電路,,因此本協(xié)議采用無連接服務[4],。協(xié)議體系結(jié)構(gòu)如圖1所示。
2 協(xié)議的設計
本文提出的協(xié)議的設計思想是數(shù)據(jù)報的傳輸方式,,即將上層應用提供的流式數(shù)據(jù)分割并格式化為一個個的數(shù)據(jù)報,,再發(fā)送給串口進行串行傳輸。接收方從串口接收到的數(shù)據(jù)報經(jīng)過重新拼接形成數(shù)據(jù)流再送給上層應用,。為保證串行傳輸,,每個數(shù)據(jù)報的傳輸中采取發(fā)送—應答—重傳—失敗的方式工作。協(xié)議工作前需要設置超時等待時間,、數(shù)據(jù)分割長度,、串口參數(shù)等參數(shù)[5-6]。
2.1 數(shù)據(jù)報格式
數(shù)據(jù)報分為報文頭部和數(shù)據(jù)部兩部分,,其格式如圖2所示,。報文頭部由6字節(jié)組成,第1,、2字節(jié)AB表示報文長度,,即報文頭部長度加上數(shù)據(jù)部長度;第3,、4字節(jié)CD表示整個報文的校驗和,;第5、6字節(jié)XX表示應答ACK,;第7,、8字節(jié)GH表示報文序號。
數(shù)據(jù)報長度AB范圍為0~65 535,,所以一個報文最大為8 KB,。數(shù)據(jù)部長度等于報文長度(AB)減去報文頭長度(8 B)。
2.2 數(shù)據(jù)處理與報文處理
數(shù)據(jù)處理包括分割上層應用提供的數(shù)據(jù),,以及從報文還原拼接數(shù)據(jù),;報文處理包括格式化報文以提供給串口發(fā)送以及從串口讀取報文、校驗報文,、提取數(shù)據(jù)[7],。
2.2.1 數(shù)據(jù)分割
協(xié)議從應用程序接口獲取應用程序提供的數(shù)據(jù)并以流式數(shù)據(jù)寫入發(fā)送方數(shù)據(jù)緩沖區(qū);然后以事先設定的數(shù)據(jù)分割長度取數(shù)據(jù),,長度不足的部分則全部取出,,取數(shù)據(jù)指針移動相應距離。
2.2.2 報文組裝
報文的組裝過程如下[8]:
?。?)計算取出數(shù)據(jù)的長度,,填入報文第1、2字節(jié),;
?。?)報文第3~6字節(jié)全部置0;
?。?)計算報文序號GH,;
(4)計算校驗和,,從第1字節(jié)開始,,每兩個字節(jié)為一個單元進行分割,末尾不足兩字節(jié)則在其后補0,,再將這些單元進行二進制反碼求和,,結(jié)果存在檢驗和字段中第3、4字節(jié),;
?。?)將取出的數(shù)據(jù)接在報文頭部后面,將整個報文寫入報文緩沖區(qū),。
2.2.3 報文拆分
報文拆分的具體步驟如下[9]:
?。?)從報文緩沖區(qū)按報文長度獲取報文數(shù)據(jù);
?。?)計算校驗和,,方法同報文組裝里的計算方法:如果校驗和不為0xFFFF,則傳輸過程中發(fā)生差錯,,丟棄此報文,;如果校驗和為0xFFFF,取出報文長度及報文序號,,計算數(shù)據(jù)部長度,,取出數(shù)據(jù)[9]。
2.2.4 數(shù)據(jù)拼接
將從報文取出的數(shù)據(jù)填入接收方數(shù)據(jù)緩沖區(qū),,寫數(shù)據(jù)指針移動相應距離,;接收完最后一個數(shù)據(jù)后,,協(xié)議將數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)提供給上層應用程序,寫數(shù)據(jù)指針恢復初始值,。
2.3 數(shù)據(jù)報傳輸過程
數(shù)據(jù)報傳輸情況分為考慮定時器超時和不考慮定時器超時兩種,,定時器超時處理應屬于中斷調(diào)用。
2.3.1 傳輸過程
數(shù)據(jù)報傳輸過程如下[10]:
?。?)在進行數(shù)據(jù)報傳輸前,,發(fā)送方將數(shù)據(jù)分割并裝進報文,ACK置為0x0000,,計算報文序號,,再將報文送入報文緩沖區(qū)。
?。?)開始發(fā)送時,,串口按已經(jīng)設定的工作方式和波特率工作,從報文緩沖區(qū)獲取報文數(shù)據(jù)并發(fā)送,。
?。?)發(fā)送方發(fā)送完畢一個數(shù)據(jù)報后,停止發(fā)送,,啟動定時器計時,,準備接收響應。
?。?)接收方串口接收數(shù)據(jù)并填入報文緩沖區(qū),。
(5)接收方從報文緩沖區(qū)獲取報文數(shù)據(jù),,進行校驗:
?、偃艚邮辗叫r灲Y(jié)果為正確,則取出數(shù)據(jù),;若接收的ACK=0x0011并且收到的序號等于前面一個報文的序號,,則將數(shù)據(jù)覆蓋到前一塊數(shù)據(jù),否則將數(shù)據(jù)填入數(shù)據(jù)緩沖區(qū),;記錄報文序號,,發(fā)送數(shù)據(jù)部為空、ACK=0x1111的報文,。
?、谌艚邮辗叫r灲Y(jié)果為錯誤,則丟棄數(shù)據(jù)報,,發(fā)送數(shù)據(jù)部為空,、ACK=0x1110的報文,通知發(fā)送方重發(fā),。
?。?)接收方每次處理完數(shù)據(jù)報均初始化并啟動定時器計時,,剛收到數(shù)據(jù)報時關閉定時器。
?。?)發(fā)送方收到響應報文,,校驗通過則關閉定時器,獲取ACK,,若ACK=0x1111,則發(fā)送下一個數(shù)據(jù)報,;若ACK=0x1110,,則重發(fā)當前數(shù)據(jù)報(ACK置0x0011)。如果校驗不通過就丟棄此數(shù)據(jù)報,,仍保持定時器計時,。
(8)雙方重復以上步驟直到最后一個報文發(fā)送完畢,。
?。?)發(fā)送方發(fā)送最后一個報文完成后,發(fā)送數(shù)據(jù)部為空,、ACK=0x0001的報文提示數(shù)據(jù)傳輸完畢,,若此報文發(fā)送后收到重傳響應,則重發(fā)此數(shù)據(jù)報(ACK仍置0x0001)[10],。
2.3.2 定時器超時處理
若發(fā)送方定時器達到發(fā)送方超時等待時間仍未收到響應報文,,則重傳當前數(shù)據(jù)報(ACK置0x0011),連續(xù)超時三次還沒收到應答則停止發(fā)送數(shù)據(jù)報,,清空報文緩沖區(qū)和數(shù)據(jù)緩沖區(qū),,并向應用程序返回通信失敗[11]。若接收方定時器達到接收方超時等待時間仍未收到報文,,清空報文緩沖區(qū)和數(shù)據(jù)緩沖區(qū),,關閉定時器,并向上層應用程序返回通信失敗,。
3 結(jié)論
本文所設計的協(xié)議封裝串口通信是為了更方便和安全地傳送數(shù)據(jù),,從上文可以看到,在發(fā)送大數(shù)據(jù)報時,,串口的速度其實不高,,而本協(xié)議若需控制在毫秒級的處理,所發(fā)數(shù)據(jù)不能超過1 192 B,。報文長度字節(jié)AB范圍為0~65 535,,故每個報文大小為8 B~8 KB,數(shù)據(jù)部大小為0~8 184 B,,所以數(shù)據(jù)分割范圍為0~8 184 B[12],。故本協(xié)議更適用于小數(shù)據(jù)量傳送,,比如在信號采集后的數(shù)據(jù)傳送等,傳輸一個雙精度浮點數(shù)需要14 ms左右,。
參考文獻
[1] 陳荔,,張菁.基于串口自定義協(xié)議傳輸文件的設計[J].計算機技術與發(fā)展,2012,,22(2):45-48.
[2] 董翰川,,郭勇,李文杰.LabVIEW串口通信在數(shù)據(jù)采集中的應用[J].微型機與應用,,2011,,30(23):63-64.
[3] 王承君.自定義串口數(shù)據(jù)通信協(xié)議的分析與設計[J].計算機工程,2004(24):192-194.
[4] 王嬌,,姚竹亭.基于VC++6.0的串口通信的設計[J].電子測試,,2009(11):47-50.
[5] 李長林,高潔.Visual C++串口通信技術與典型實例[M].北京:清華大學出版社,,2006.
[6] 李志強,,汪晴,徐曉鐵,,等.一種基于跨層設計的簡單可靠UDP協(xié)議[J].解放軍理工大學學報(自然科學版),,2009,10(3):209-214.
[7] 蘆東昕,,張華強,,王陳.基于UDP的可靠數(shù)據(jù)傳遞技術研究[J].計算機工程,2003,,29(22):62-63.
[8] 趙玉劍,,范修榮.單片機與PC串行通信的實現(xiàn)[J].機電產(chǎn)品開發(fā)與創(chuàng)新,2008,,2(5):96-97.
[9] 范月霞,,吳正江.一種新型串口通信類的實現(xiàn)[J].艦船電子工程,2008,,28(4):157-159.
[10] 靳海力,,李俊.具有補發(fā)機制的增強型可靠UDP的實現(xiàn)[J].小型微型計算機系統(tǒng),2010(5):904-907.
[11] 林培杰,,黃比得,,黃春暉.基于TMS320C6713的McBSP和EDMA實現(xiàn)串口通信[J].電子技術應用,2009,,35(2):33-35.
[12] 朱耀麟,,馬慧銘.USB3.0超高速多串口傳輸系統(tǒng)的設計[J].電子技術應用,2013,,39(9):138-140.