《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 封裝串口數(shù)據(jù)通信協(xié)議的設(shè)計(jì)
封裝串口數(shù)據(jù)通信協(xié)議的設(shè)計(jì)
2014年微型機(jī)與應(yīng)用第18期
曾 維,羅 粟,黃 宏,徐 驥,賴鎮(zhèn)森
成都理工大學(xué) 信息科學(xué)與技術(shù)學(xué)院,四川 成都 610059
摘要: 為了提高串口數(shù)據(jù)通信的準(zhǔn)確率、方便上層應(yīng)用編程,設(shè)計(jì)了一個(gè)協(xié)議對(duì)串口數(shù)據(jù)通信協(xié)議進(jìn)行封裝。協(xié)議采用自定義報(bào)文格式封裝串口數(shù)據(jù)幀的方式工作,利用報(bào)文應(yīng)答機(jī)制保證傳輸正確性,該協(xié)議在線路故障出現(xiàn)時(shí)能有效檢測(cè)并采取報(bào)文重發(fā)等措施保證數(shù)據(jù)準(zhǔn)確傳輸。
Abstract:
Key words :

  摘  要: 為了提高串口數(shù)據(jù)通信的準(zhǔn)確率、方便上層應(yīng)用編程,設(shè)計(jì)了一個(gè)協(xié)議對(duì)串口數(shù)據(jù)通信協(xié)議進(jìn)行封裝。協(xié)議采用自定義報(bào)文格式封裝串口數(shù)據(jù)幀的方式工作,利用報(bào)文應(yīng)答機(jī)制保證傳輸正確性,該協(xié)議在線路故障出現(xiàn)時(shí)能有效檢測(cè)并采取報(bào)文重發(fā)等措施保證數(shù)據(jù)準(zhǔn)確傳輸。

  關(guān)鍵詞: 串口;通信協(xié)議;數(shù)據(jù)報(bào);數(shù)據(jù)傳輸

0 引言

  串口通信協(xié)議是計(jì)算機(jī)上非常通用的一種設(shè)備通信協(xié)議,串口按位(bit)發(fā)送和接收字節(jié),可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)[1]。利用串口進(jìn)行數(shù)據(jù)傳輸時(shí),串口能做到奇偶校驗(yàn)以確定數(shù)據(jù)是否傳輸正確,然而在實(shí)際的上位機(jī)和下位機(jī)的通信中,往往傳輸以字節(jié)為單位的數(shù)據(jù),這樣僅奇偶校驗(yàn)數(shù)據(jù)位并不能達(dá)到正確傳輸數(shù)據(jù)的目的[2],因此需要建立在串口之上的數(shù)據(jù)交換規(guī)則,即封裝串口通信的協(xié)議[3]。本文設(shè)計(jì)的就是一種用數(shù)據(jù)報(bào)封裝了串口數(shù)據(jù)通信的協(xié)議,它能有效檢測(cè)線路狀態(tài)并處理丟包等問(wèn)題。它不僅能實(shí)現(xiàn)PC之間的數(shù)據(jù)傳輸,還可用于嵌入式設(shè)備的數(shù)據(jù)通信。

1 協(xié)議分層結(jié)構(gòu)

  為了使協(xié)議程序的設(shè)計(jì)更為合理,并且利于在各硬件系統(tǒng)使用,將此協(xié)議進(jìn)行分層設(shè)計(jì)。由于串口通信的性質(zhì),無(wú)需過(guò)多采用面向連接來(lái)建立虛電路,因此本協(xié)議采用無(wú)連接服務(wù)[4]。協(xié)議體系結(jié)構(gòu)如圖1所示。

001.jpg

2 協(xié)議的設(shè)計(jì)

  本文提出的協(xié)議的設(shè)計(jì)思想是數(shù)據(jù)報(bào)的傳輸方式,即將上層應(yīng)用提供的流式數(shù)據(jù)分割并格式化為一個(gè)個(gè)的數(shù)據(jù)報(bào),再發(fā)送給串口進(jìn)行串行傳輸。接收方從串口接收到的數(shù)據(jù)報(bào)經(jīng)過(guò)重新拼接形成數(shù)據(jù)流再送給上層應(yīng)用。為保證串行傳輸,每個(gè)數(shù)據(jù)報(bào)的傳輸中采取發(fā)送—應(yīng)答—重傳—失敗的方式工作。協(xié)議工作前需要設(shè)置超時(shí)等待時(shí)間、數(shù)據(jù)分割長(zhǎng)度、串口參數(shù)等參數(shù)[5-6]。

  2.1 數(shù)據(jù)報(bào)格式

002.jpg

  數(shù)據(jù)報(bào)分為報(bào)文頭部和數(shù)據(jù)部?jī)刹糠?,其格式如圖2所示。報(bào)文頭部由6字節(jié)組成,第1、2字節(jié)AB表示報(bào)文長(zhǎng)度,即報(bào)文頭部長(zhǎng)度加上數(shù)據(jù)部長(zhǎng)度;第3、4字節(jié)CD表示整個(gè)報(bào)文的校驗(yàn)和;第5、6字節(jié)XX表示應(yīng)答ACK;第7、8字節(jié)GH表示報(bào)文序號(hào)。

  數(shù)據(jù)報(bào)長(zhǎng)度AB范圍為0~65 535,所以一個(gè)報(bào)文最大為8 KB。數(shù)據(jù)部長(zhǎng)度等于報(bào)文長(zhǎng)度(AB)減去報(bào)文頭長(zhǎng)度(8 B)。

  2.2 數(shù)據(jù)處理與報(bào)文處理

  數(shù)據(jù)處理包括分割上層應(yīng)用提供的數(shù)據(jù),以及從報(bào)文還原拼接數(shù)據(jù);報(bào)文處理包括格式化報(bào)文以提供給串口發(fā)送以及從串口讀取報(bào)文、校驗(yàn)報(bào)文、提取數(shù)據(jù)[7]。

  2.2.1 數(shù)據(jù)分割

  協(xié)議從應(yīng)用程序接口獲取應(yīng)用程序提供的數(shù)據(jù)并以流式數(shù)據(jù)寫(xiě)入發(fā)送方數(shù)據(jù)緩沖區(qū);然后以事先設(shè)定的數(shù)據(jù)分割長(zhǎng)度取數(shù)據(jù),長(zhǎng)度不足的部分則全部取出,取數(shù)據(jù)指針移動(dòng)相應(yīng)距離。

  2.2.2 報(bào)文組裝

  報(bào)文的組裝過(guò)程如下[8]:

  (1)計(jì)算取出數(shù)據(jù)的長(zhǎng)度,填入報(bào)文第1、2字節(jié);

 ?。?)報(bào)文第3~6字節(jié)全部置0;

 ?。?)計(jì)算報(bào)文序號(hào)GH;

 ?。?)計(jì)算校驗(yàn)和,從第1字節(jié)開(kāi)始,每?jī)蓚€(gè)字節(jié)為一個(gè)單元進(jìn)行分割,末尾不足兩字節(jié)則在其后補(bǔ)0,再將這些單元進(jìn)行二進(jìn)制反碼求和,結(jié)果存在檢驗(yàn)和字段中第3、4字節(jié);

 ?。?)將取出的數(shù)據(jù)接在報(bào)文頭部后面,將整個(gè)報(bào)文寫(xiě)入報(bào)文緩沖區(qū)。

  2.2.3 報(bào)文拆分

  報(bào)文拆分的具體步驟如下[9]:

  (1)從報(bào)文緩沖區(qū)按報(bào)文長(zhǎng)度獲取報(bào)文數(shù)據(jù);

 ?。?)計(jì)算校驗(yàn)和,方法同報(bào)文組裝里的計(jì)算方法:如果校驗(yàn)和不為0xFFFF,則傳輸過(guò)程中發(fā)生差錯(cuò),丟棄此報(bào)文;如果校驗(yàn)和為0xFFFF,取出報(bào)文長(zhǎng)度及報(bào)文序號(hào),計(jì)算數(shù)據(jù)部長(zhǎng)度,取出數(shù)據(jù)[9]。

  2.2.4 數(shù)據(jù)拼接

  將從報(bào)文取出的數(shù)據(jù)填入接收方數(shù)據(jù)緩沖區(qū),寫(xiě)數(shù)據(jù)指針移動(dòng)相應(yīng)距離;接收完最后一個(gè)數(shù)據(jù)后,協(xié)議將數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)提供給上層應(yīng)用程序,寫(xiě)數(shù)據(jù)指針恢復(fù)初始值。

  2.3 數(shù)據(jù)報(bào)傳輸過(guò)程

  數(shù)據(jù)報(bào)傳輸情況分為考慮定時(shí)器超時(shí)和不考慮定時(shí)器超時(shí)兩種,定時(shí)器超時(shí)處理應(yīng)屬于中斷調(diào)用。

  2.3.1 傳輸過(guò)程

  數(shù)據(jù)報(bào)傳輸過(guò)程如下[10]:

 ?。?)在進(jìn)行數(shù)據(jù)報(bào)傳輸前,發(fā)送方將數(shù)據(jù)分割并裝進(jìn)報(bào)文,ACK置為0x0000,計(jì)算報(bào)文序號(hào),再將報(bào)文送入報(bào)文緩沖區(qū)。

 ?。?)開(kāi)始發(fā)送時(shí),串口按已經(jīng)設(shè)定的工作方式和波特率工作,從報(bào)文緩沖區(qū)獲取報(bào)文數(shù)據(jù)并發(fā)送。

  (3)發(fā)送方發(fā)送完畢一個(gè)數(shù)據(jù)報(bào)后,停止發(fā)送,啟動(dòng)定時(shí)器計(jì)時(shí),準(zhǔn)備接收響應(yīng)。

 ?。?)接收方串口接收數(shù)據(jù)并填入報(bào)文緩沖區(qū)。

 ?。?)接收方從報(bào)文緩沖區(qū)獲取報(bào)文數(shù)據(jù),進(jìn)行校驗(yàn):

  ①若接收方校驗(yàn)結(jié)果為正確,則取出數(shù)據(jù);若接收的ACK=0x0011并且收到的序號(hào)等于前面一個(gè)報(bào)文的序號(hào),則將數(shù)據(jù)覆蓋到前一塊數(shù)據(jù),否則將數(shù)據(jù)填入數(shù)據(jù)緩沖區(qū);記錄報(bào)文序號(hào),發(fā)送數(shù)據(jù)部為空、ACK=0x1111的報(bào)文。

 ?、谌艚邮辗叫r?yàn)結(jié)果為錯(cuò)誤,則丟棄數(shù)據(jù)報(bào),發(fā)送數(shù)據(jù)部為空、ACK=0x1110的報(bào)文,通知發(fā)送方重發(fā)。

 ?。?)接收方每次處理完數(shù)據(jù)報(bào)均初始化并啟動(dòng)定時(shí)器計(jì)時(shí),剛收到數(shù)據(jù)報(bào)時(shí)關(guān)閉定時(shí)器。

 ?。?)發(fā)送方收到響應(yīng)報(bào)文,校驗(yàn)通過(guò)則關(guān)閉定時(shí)器,獲取ACK,若ACK=0x1111,則發(fā)送下一個(gè)數(shù)據(jù)報(bào);若ACK=0x1110,則重發(fā)當(dāng)前數(shù)據(jù)報(bào)(ACK置0x0011)。如果校驗(yàn)不通過(guò)就丟棄此數(shù)據(jù)報(bào),仍保持定時(shí)器計(jì)時(shí)。

  (8)雙方重復(fù)以上步驟直到最后一個(gè)報(bào)文發(fā)送完畢。

 ?。?)發(fā)送方發(fā)送最后一個(gè)報(bào)文完成后,發(fā)送數(shù)據(jù)部為空、ACK=0x0001的報(bào)文提示數(shù)據(jù)傳輸完畢,若此報(bào)文發(fā)送后收到重傳響應(yīng),則重發(fā)此數(shù)據(jù)報(bào)(ACK仍置0x0001)[10]。

  2.3.2 定時(shí)器超時(shí)處理

  若發(fā)送方定時(shí)器達(dá)到發(fā)送方超時(shí)等待時(shí)間仍未收到響應(yīng)報(bào)文,則重傳當(dāng)前數(shù)據(jù)報(bào)(ACK置0x0011),連續(xù)超時(shí)三次還沒(méi)收到應(yīng)答則停止發(fā)送數(shù)據(jù)報(bào),清空?qǐng)?bào)文緩沖區(qū)和數(shù)據(jù)緩沖區(qū),并向應(yīng)用程序返回通信失敗[11]。若接收方定時(shí)器達(dá)到接收方超時(shí)等待時(shí)間仍未收到報(bào)文,清空?qǐng)?bào)文緩沖區(qū)和數(shù)據(jù)緩沖區(qū),關(guān)閉定時(shí)器,并向上層應(yīng)用程序返回通信失敗。

3 結(jié)論

  本文所設(shè)計(jì)的協(xié)議封裝串口通信是為了更方便和安全地傳送數(shù)據(jù),從上文可以看到,在發(fā)送大數(shù)據(jù)報(bào)時(shí),串口的速度其實(shí)不高,而本協(xié)議若需控制在毫秒級(jí)的處理,所發(fā)數(shù)據(jù)不能超過(guò)1 192 B。報(bào)文長(zhǎng)度字節(jié)AB范圍為0~65 535,故每個(gè)報(bào)文大小為8 B~8 KB,數(shù)據(jù)部大小為0~8 184 B,所以數(shù)據(jù)分割范圍為0~8 184 B[12]。故本協(xié)議更適用于小數(shù)據(jù)量傳送,比如在信號(hào)采集后的數(shù)據(jù)傳送等,傳輸一個(gè)雙精度浮點(diǎn)數(shù)需要14 ms左右。

  參考文獻(xiàn)

  [1] 陳荔,張菁.基于串口自定義協(xié)議傳輸文件的設(shè)計(jì)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2012,22(2):45-48.

  [2] 董翰川,郭勇,李文杰.LabVIEW串口通信在數(shù)據(jù)采集中的應(yīng)用[J].微型機(jī)與應(yīng)用,2011,30(23):63-64.

  [3] 王承君.自定義串口數(shù)據(jù)通信協(xié)議的分析與設(shè)計(jì)[J].計(jì)算機(jī)工程,2004(24):192-194.

  [4] 王嬌,姚竹亭.基于VC++6.0的串口通信的設(shè)計(jì)[J].電子測(cè)試,2009(11):47-50.

  [5] 李長(zhǎng)林,高潔.Visual C++串口通信技術(shù)與典型實(shí)例[M].北京:清華大學(xué)出版社,2006.

  [6] 李志強(qiáng),汪晴,徐曉鐵,等.一種基于跨層設(shè)計(jì)的簡(jiǎn)單可靠UDP協(xié)議[J].解放軍理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2009,10(3):209-214.

  [7] 蘆東昕,張華強(qiáng),王陳.基于UDP的可靠數(shù)據(jù)傳遞技術(shù)研究[J].計(jì)算機(jī)工程,2003,29(22):62-63.

  [8] 趙玉劍,范修榮.單片機(jī)與PC串行通信的實(shí)現(xiàn)[J].機(jī)電產(chǎn)品開(kāi)發(fā)與創(chuàng)新,2008,2(5):96-97.

  [9] 范月霞,吳正江.一種新型串口通信類的實(shí)現(xiàn)[J].艦船電子工程,2008,28(4):157-159.

  [10] 靳海力,李俊.具有補(bǔ)發(fā)機(jī)制的增強(qiáng)型可靠UDP的實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2010(5):904-907.

  [11] 林培杰,黃比得,黃春暉.基于TMS320C6713的McBSP和EDMA實(shí)現(xiàn)串口通信[J].電子技術(shù)應(yīng)用,2009,35(2):33-35.

  [12] 朱耀麟,馬慧銘.USB3.0超高速多串口傳輸系統(tǒng)的設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2013,39(9):138-140.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。