單片機(jī)接收數(shù)據(jù)幀幀頭和幀尾用于數(shù)據(jù)包完整性的判別_第1頁(yè)
單片機(jī)接收數(shù)據(jù)幀幀頭和幀尾用于數(shù)據(jù)包完整性的判別_第2頁(yè)
單片機(jī)接收數(shù)據(jù)幀幀頭和幀尾用于數(shù)據(jù)包完整性的判別_第3頁(yè)
單片機(jī)接收數(shù)據(jù)幀幀頭和幀尾用于數(shù)據(jù)包完整性的判別_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、單片機(jī)接收數(shù)據(jù)幀幀頭和幀尾用于數(shù)據(jù)包完整性的判別1. 自定義數(shù)據(jù)通信協(xié)議這里所說(shuō)的數(shù)據(jù)協(xié)議是建立在物理層之上的通信數(shù)據(jù)包格式。所謂通信的物理 層就是指我們通常所用到的 RS232、RS485紅外、光纖、無(wú)線等等通信方式。 在這個(gè)層面上,底層軟件提供兩個(gè)基本的操作函數(shù): 發(fā)送一個(gè)字節(jié)數(shù)據(jù)、接收一 個(gè)字節(jié)數(shù)據(jù)。所有的數(shù)據(jù)協(xié)議全部建立在這兩個(gè)操作方法之上。通信中的數(shù)據(jù)往往以數(shù)據(jù)包的形式進(jìn)行傳送的, 我們把這樣的一個(gè)數(shù)據(jù)包稱(chēng)作為 一幀數(shù)據(jù)。類(lèi)似于網(wǎng)絡(luò)通信中的 TCPIP協(xié)議一般,比較可靠的通信協(xié)議往往包 含有以下幾個(gè)組成部分:幀頭、地址信息、數(shù)據(jù)類(lèi)型、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)塊、校驗(yàn) 碼、幀尾。幀頭和幀尾用于數(shù)

2、據(jù)包完整性的判別,通常選擇一定長(zhǎng)度的固定字節(jié)組成,要 求是在整個(gè)數(shù)據(jù)鏈中判別數(shù)據(jù)包的誤碼率越低越好。 減小固定字節(jié)數(shù)據(jù)的匹配機(jī) 會(huì),也就是說(shuō)使幀頭和幀尾的特征字節(jié)在整個(gè)數(shù)據(jù)鏈中能夠匹配的機(jī)會(huì)最小。通常有兩種做法,一、減小特征字節(jié)的匹配幾率。二、增加特征字節(jié)的長(zhǎng)度。通常 選取第一種方法的情況是整個(gè)數(shù)據(jù)鏈路中的數(shù)據(jù)不具有隨即性,數(shù)據(jù)可預(yù)測(cè),可以通過(guò)人為選擇幀頭和幀尾的特征字來(lái)避開(kāi),從而減小特征字節(jié)的匹配幾率。使用第二種方法的情況更加通用,適合于數(shù)據(jù)隨即的場(chǎng)合。通過(guò)增加特征字節(jié)的長(zhǎng) 度減小匹配幾率,雖然不能夠完全的避免匹配的情況, 但可以使匹配幾率大大減 小,如果碰到匹配的情況也可以由校驗(yàn)碼來(lái)進(jìn)行檢

3、測(cè),因此這種情況在絕大多說(shuō)情況下比較可靠。地址信息主要用于多機(jī)通信中,通過(guò)地址信息的不同來(lái)識(shí)別不同的通信終端。 在一對(duì)多的通信系統(tǒng)中,可以只包含目的地址信息。同時(shí)包含源地址和目的地址 則適用于多對(duì)多的通信系統(tǒng)。數(shù)據(jù)類(lèi)型、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)塊是主要的數(shù)據(jù)部分。數(shù)據(jù)類(lèi)型可以標(biāo)識(shí)后面緊接 著的是命令還是數(shù)據(jù)。數(shù)據(jù)長(zhǎng)度用于指示有效數(shù)據(jù)的個(gè)數(shù)。校驗(yàn)碼則用來(lái)檢驗(yàn)數(shù)據(jù)的完整性和正確性。通常對(duì)數(shù)據(jù)類(lèi)型、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù) 塊三個(gè)部分進(jìn)行相關(guān)的運(yùn)算得到。最簡(jiǎn)單的做法可是對(duì)數(shù)據(jù)段作累加和,復(fù)雜的 也可以對(duì)數(shù)據(jù)進(jìn)行CRC運(yùn)算等等,可以根據(jù)運(yùn)算速度、容錯(cuò)度等要求來(lái)選取。2. 上位機(jī)和下位機(jī)中的數(shù)據(jù)發(fā)送物理通信層中提供了兩個(gè)基

4、本的操作函數(shù),發(fā)送一個(gè)字節(jié)數(shù)據(jù)則為數(shù)據(jù)發(fā)送的 基礎(chǔ)。數(shù)據(jù)包的發(fā)送即把數(shù)據(jù)包中的左右字節(jié)按照順序一個(gè)一個(gè)的發(fā)送數(shù)據(jù)而 已。當(dāng)然發(fā)送的方法也有不同。在單片機(jī)系統(tǒng)中,比較常用的方法是直接調(diào)用串口發(fā)送單個(gè)字節(jié)數(shù)據(jù)的函數(shù)。 這種方法的缺點(diǎn)是需要處理器在發(fā)送過(guò)程中全程參與,優(yōu)點(diǎn)是所要發(fā)送的數(shù)據(jù)能 夠立即的出現(xiàn)在通信線路上,能夠立即被接收端接收到。另外一種方法是采用中 斷發(fā)送的方式,所有需要發(fā)送的數(shù)據(jù)被送入一個(gè)緩沖區(qū), 利用發(fā)送中斷將緩沖區(qū) 中的數(shù)據(jù)發(fā)送出去。這種方法的優(yōu)點(diǎn)是占用處理器資源小, 但是可能出現(xiàn)需要發(fā) 送的數(shù)據(jù)不能立即被發(fā)送的情況,不過(guò)這種時(shí)延相當(dāng)?shù)男?。?duì)于51系列單片機(jī),比較傾向于采用直接發(fā)送

5、的方式,采用中斷發(fā)送的方式比較占用RAM資源,而且對(duì)比直接發(fā)送來(lái)說(shuō)也沒(méi)有太多的優(yōu)點(diǎn)。 以下是51系列單片機(jī)中發(fā)送單個(gè)字節(jié)的 函數(shù)。void Sen dByte( un sig ned char ch)SBUF = ch;while(TI = 0);TI = 0;上位機(jī)中關(guān)于串口通信的方式也有多種,這種方式不是指數(shù)據(jù)有沒(méi)有緩沖的問(wèn) 題,而是操作串口的方式不同,因?yàn)镻C上數(shù)據(jù)發(fā)送基本上都會(huì)被緩沖后再發(fā)送。 對(duì)于編程來(lái)說(shuō)操作串口有三種方式,一、使用windows系統(tǒng)中自帶的串口通信控件,這種方式使用起來(lái)比較簡(jiǎn)單,需要注意的是接收時(shí)的阻塞處理和線程機(jī)制。 二、使用系統(tǒng)的API直接進(jìn)行串口數(shù)據(jù)的讀取,在

6、 windows和linux系統(tǒng)中,設(shè) 備被虛擬為文件,只需要利用系統(tǒng)提供的API函數(shù)即可進(jìn)行串口數(shù)據(jù)的發(fā)送和讀取。三、使用串口類(lèi)進(jìn)行串口操作。在此只介紹windows環(huán)境下利用串口類(lèi)編程的方式。CSerialPort是比較好用的串口類(lèi)。它提供如下的串口操作方法:void WriteToPort(char* stri ng, in t le n);串口初始化成功后,調(diào)用此函數(shù)即可向串口發(fā)送數(shù)據(jù)。為了避免串口緩沖所帶 來(lái)的延時(shí),可以開(kāi)啟串口的沖刷機(jī)制。3. 下位機(jī)中的數(shù)據(jù)接收和協(xié)議解析下位機(jī)接收數(shù)據(jù)也有兩種方式,一、等待接收,處理器一直查詢(xún)串口狀態(tài),來(lái) 判斷是否接收到數(shù)據(jù)。二、中斷接收。兩種方法

7、的優(yōu)缺點(diǎn)在此前的一篇關(guān)于串口 通信的文章中詳細(xì)討論過(guò)。得出的結(jié)論是采用中斷接收的方法比較好。數(shù)據(jù)包的解析過(guò)程可以設(shè)置到不同的位置。如果協(xié)議比較簡(jiǎn)單,整個(gè)系統(tǒng)只是 處理一些簡(jiǎn)單的命令,那么可以直接把數(shù)據(jù)包的解析過(guò)程放入到中斷處理函數(shù) 中,當(dāng)收到正確的數(shù)據(jù)包的時(shí)候,置位相應(yīng)的標(biāo)志,在主程序中再對(duì)命令進(jìn)行處 理。如果協(xié)議稍微復(fù)雜,比較好的方式是將接收的數(shù)據(jù)存放于緩沖區(qū)中,主程序讀取數(shù)據(jù)后進(jìn)行解析。也有兩種方式交叉使用的,比如一對(duì)多的系統(tǒng)中,首先在 接收中斷中解析 連接”命令,連接命令接收到后主程序進(jìn)入設(shè)置狀態(tài),采用查詢(xún)的方式來(lái)解析其余的協(xié)議。以下給出具體的實(shí)例。在這個(gè)系統(tǒng)中,串口的命令非常簡(jiǎn)單。所有

8、的協(xié)議全部 在串口中斷中進(jìn)行。數(shù)據(jù)包的格式如下:0x55, OxAA, 0x7E, 0x12, OxFO, 0x02, 0x23, 0x45, SUM, XOR, 0x0D其中0x55, 0xAA, 0x7E為數(shù)據(jù)幀的幀頭,0x0D為幀尾,0x12為設(shè)備的目的地址, OxFO為源地址,0x02為數(shù)據(jù)長(zhǎng)度,后面接著兩個(gè)數(shù)據(jù)0x23, 0x45,從目的地址開(kāi) 始結(jié)算累加、異或校驗(yàn)和,到數(shù)據(jù)的最后一位結(jié)束。協(xié)議解析的目的,首先判斷數(shù)據(jù)包的完整性,正確性,然后提取數(shù)據(jù)類(lèi)型,數(shù)據(jù)等數(shù)據(jù),存放起來(lái)用于主程序處理。代碼如下:if(state_machi ne = 0) /協(xié)、議解析狀態(tài)機(jī) _if(rcvda

9、t = 0x55) /接收到幀頭第一個(gè)數(shù)據(jù)state_mach ine = 1;elsestate_mach ine = 0; /狀態(tài)機(jī)復(fù)位 _else if(state_machi ne = 1)if(rcvdat = OxAA) /接收到幀頭第二個(gè)數(shù)據(jù) state_mach ine = 2;elsestate_mach ine = 0; /狀態(tài)機(jī)復(fù)位 _else if(state_machi ne = 2)if(rcvdat = 0x7E) /接收到幀頭第三個(gè)數(shù)據(jù)state_mach ine = 3;elsestate_mach ine = 0; /狀態(tài)機(jī)復(fù)位else if(state_m

10、achi ne = 3) _sumchkm = rcvdat; /幵始計(jì)算累加、異或校驗(yàn)和 xorchkm = rcvdat;if(rcvdat = m_SrcAdr) /判斷目的地址是否正確 state_mach ine = 4;elsestate_mach ine = 0; _else if(state_machi ne = 4) _sumchkm += rcvdat;xorchkm A= rcvdat;if(rcvdat = m_DstAdr) /判斷源地址是否正確 state_mach ine = 5;elsestate_mach ine = 0;else if(state_machi

11、 ne = 5)len cnt = 0; 接收數(shù)據(jù)計(jì)數(shù)器rcvcou nt = rcvdat; /接收數(shù)據(jù)長(zhǎng)度sumchkm += rcvdat;xorchkm a= rcvdat;state_mach ine = 6; _else if(state _mach ine = 6 | state _machi ne = 7) m_ucDatale ncn t+ = rcvdat; 數(shù)據(jù)保存 sumchkm += rcvdat;xorchkm a= rcvdat;if(le ncnt = rcvcoun t) /判斷數(shù)據(jù)是否接收完畢state_mach ine = 8;elsestate_mach

12、 ine = 7; _else if(state_machi ne = 8)if(sumchkm = rcvdat) /判斷累加和是否相等state_mach ine = 9;elsestate_mach ine = 0; _else if(state_machi ne = 9) _if(xorchkm = rcvdat) /判斷異或校驗(yàn)和是否相等state_mach ine = 10;elsestate_mach ine = 0; _else if(state_machi ne = 10)if(0x0D = rcvdat) /判斷是否接收到幀尾結(jié)束符retval = 0xaa; /置標(biāo)志,表示一個(gè)數(shù)據(jù)包接收到state_mach ine = 0;復(fù)位狀態(tài)機(jī) _此過(guò)程中,使用了一個(gè)變量state_machi ne作為協(xié)議狀態(tài)機(jī)的轉(zhuǎn)換狀態(tài),用于確 定當(dāng)前字節(jié)處于一幀數(shù)據(jù)中的那個(gè)部位,同時(shí)在接收過(guò)程中自動(dòng)對(duì)接收數(shù)據(jù)進(jìn)行 校驗(yàn)和處理,在數(shù)據(jù)包接收完的同時(shí)也進(jìn)行了校驗(yàn)的比較。因此當(dāng)幀尾結(jié)束符接 收到的時(shí)候,則表示一幀數(shù)據(jù)已經(jīng)接收完畢,并且通過(guò)了校驗(yàn),關(guān)鍵數(shù)據(jù)也保存 到了緩沖去中。主程序即可通過(guò) re

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論