本發(fā)明涉及一種面向離散數(shù)據(jù)流的結(jié)構(gòu)化及可靠通信方法,用于解決對串行離散數(shù)據(jù)流的可靠收發(fā)問題。
背景技術(shù):
:總線數(shù)據(jù)通信是工業(yè)控制系統(tǒng)和智能監(jiān)控系統(tǒng)設(shè)計中不可避免的問題。以太網(wǎng)絡(luò)的數(shù)據(jù)傳輸已有較為成熟的通信協(xié)議包括tcp/ip,udp等,但以字節(jié)為單位串行通信總線以及串行數(shù)據(jù)流通信還沒有統(tǒng)一的標準,而其通信的靈活性以及高效性是以太網(wǎng)絡(luò)無法媲美的,因此在實際系統(tǒng)的局部通信經(jīng)常會涉及到此類通信方式。為了避免通信瞬時的高數(shù)據(jù)負載,通常此類通信的接收方均配置有緩沖區(qū),更常用的是環(huán)形緩沖消息隊列。由于通信過程中噪聲等因素的影響,會造成通信數(shù)據(jù)的不可靠。技術(shù)實現(xiàn)要素:本發(fā)明主要面向離散數(shù)據(jù)流的可靠收發(fā)問題,提出了一種數(shù)據(jù)的結(jié)構(gòu)化打包以及解析方法,能夠高可靠性的解決兩個通信站點間的離散數(shù)據(jù)流的收發(fā)問題。本發(fā)明的主要技術(shù)方案如下:本發(fā)明與現(xiàn)有技術(shù)相比的有益效果是:(1)本發(fā)明可以用于串行數(shù)據(jù)流的異步變長數(shù)據(jù)流的通信,接收方通過緩沖隊列來完成數(shù)據(jù)流的接收,避免了通信發(fā)送方握手等待的計算資源開銷和對通信接收方的實時響應(yīng)的開銷;(2)相對于現(xiàn)有技術(shù)接收到錯誤數(shù)據(jù)后即將已經(jīng)接收到的所有數(shù)據(jù)丟棄,重啟通信接收過程而言,本發(fā)明的接收方在提取和解析數(shù)據(jù)幀的過程中可以自動識別誤幀,殘幀,最大程度的提取緩沖隊列中已經(jīng)接收到的有效數(shù)據(jù)幀;(3)本發(fā)明從幀尾的識別開始從緩沖隊列中提取有效幀數(shù)據(jù)的方法避免了數(shù)據(jù)幀的后半部分缺失以及誤把后續(xù)相鄰幀幀尾識別為前幀幀尾,造成誤將有效幀作為無效幀丟棄的可能;(4)相對于現(xiàn)有技術(shù),本發(fā)明在幀頭幀尾的定義過程中采用組合碼的形式,并考慮單字節(jié)碼距的思路,擁有更好的抗干擾技術(shù),同時也更好的避免了與待傳輸數(shù)據(jù)內(nèi)容的沖突問題,降低了轉(zhuǎn)義字符插入的平均概率,提高了通信的效率;(5)本發(fā)明可以實現(xiàn)變長數(shù)據(jù)幀的通信,不僅允許不同含義的幀數(shù)據(jù)可以擁有不同長度的幀數(shù)據(jù),同時對于同樣含義的幀數(shù)據(jù),在同一次通信過程中發(fā)送方也可以發(fā)送不同長度的數(shù)據(jù)幀。從而增加了數(shù)據(jù)通信的靈活性。(6)本發(fā)明可以在數(shù)據(jù)幀提取過程中將噪聲數(shù)據(jù)提出,并且可以自動檢測隊列中的有效數(shù)據(jù)幀。其可以被用于rs485,rs422和rs232的串行總線的通信過程以及fifo交換數(shù)據(jù)的解析問題。附圖說明圖1為本發(fā)明的解析數(shù)據(jù)幀處理過程示意圖;其中:zt表示幀頭,z表示0x5a,t表示0x54;data表示數(shù)據(jù)區(qū);sum表示接收的校驗和(由固定的0和接收的數(shù)據(jù)區(qū)算術(shù)和組成,在圖1中分別用sum0和sum1表示);len表示接收的數(shù)據(jù)長度;zw表示幀尾,z表示0x5a,w表示0xfe。具體實施方式下面結(jié)合實例及附圖1對本發(fā)明做詳細說明。(1)定義數(shù)據(jù)的結(jié)構(gòu)化協(xié)議:幀頭數(shù)據(jù)區(qū)校驗區(qū)數(shù)據(jù)長度幀尾發(fā)送順序為從幀頭到幀尾,其中:幀頭至少包含2字節(jié),每個字節(jié)至少包含4組以上采用不同數(shù)值的相鄰位;數(shù)據(jù)區(qū)由1~166個有效字節(jié)構(gòu)成,用于傳輸需要傳輸?shù)臄?shù)據(jù);校驗區(qū)包含2個字節(jié),前面字節(jié)固定且與幀尾第一個字節(jié)不同,后面字節(jié)為校驗碼;數(shù)據(jù)長度由1個字節(jié)構(gòu)成,表示數(shù)據(jù)區(qū)的字節(jié)的個數(shù),幀尾至少包含2字節(jié),每個字節(jié)至少包含4組以上采用不同數(shù)值的相鄰位,并保證與幀頭不同;為了將整個數(shù)據(jù)幀長度限制在256字節(jié)的范圍內(nèi),數(shù)據(jù)區(qū)的長度定義為最少1個字節(jié),最多166字節(jié),增加轉(zhuǎn)義字符后最多可達249字節(jié)。即數(shù)據(jù)區(qū)包含的所有數(shù)據(jù)最多為249字節(jié),但實際的有效數(shù)據(jù)最多為166字節(jié)(剔除轉(zhuǎn)義字符之后);數(shù)據(jù)長度包含有效數(shù)據(jù)和插入的轉(zhuǎn)義字符,有效范圍為1~249,其中有效數(shù)據(jù)最多166字節(jié);例如:幀頭由2字節(jié)構(gòu)成,依次為0x5a,0x54(0x5a在前,0x54在后);數(shù)據(jù)區(qū)由1~166有效字節(jié)構(gòu)成,用于傳輸需要傳輸?shù)臄?shù)據(jù);校驗區(qū)由2個字節(jié),前面字節(jié)固定為0,后面字節(jié)為數(shù)據(jù)區(qū)所有字節(jié)的算術(shù)和,溢出位舍去;此字段也可采用其他校驗方法,例如crc;數(shù)據(jù)長度由1個字節(jié)構(gòu)成,表示數(shù)據(jù)區(qū)的字節(jié)的個數(shù);幀尾由2字節(jié)構(gòu)成,用0x5a,0xfe表示(0x5a在前,0xfe在后);(2)發(fā)送方按照上述定義的數(shù)據(jù)結(jié)構(gòu)化協(xié)議對離散的數(shù)據(jù)流進行組幀,以查詢或中斷方式將整幀數(shù)據(jù)發(fā)出;由于數(shù)據(jù)的結(jié)構(gòu)化協(xié)議將幀尾定義為整個數(shù)據(jù)幀中一個唯一的標識符(其它地方不能出現(xiàn)此標識),并以收到真正的幀尾作為收到一個完整數(shù)據(jù)幀的一個重要標志(收到真正幀尾和收到一個完整幀是在同一個時刻);為了防止數(shù)據(jù)區(qū)中也出現(xiàn)幀尾的標識符(0x5a,0xfe),數(shù)據(jù)的結(jié)構(gòu)化協(xié)議定義,如果在數(shù)據(jù)區(qū)中出現(xiàn)連續(xù)的0x5a,0xfe(0x5a在先,0xfe在后)時,在前面插入一個轉(zhuǎn)義字符’\x0’,即用0+0x5a+0xfe替換0x5a+0xfe。由于數(shù)據(jù)長度肯定大于0,所以在幀數(shù)據(jù)識別的過程中,真正的幀尾應(yīng)為:一個非0數(shù)+0x5a+0xfe。在數(shù)據(jù)區(qū)引入轉(zhuǎn)義功能后就不可能出現(xiàn)幀尾的特征組合;因此,具體的組幀步驟如下:(2.1)根據(jù)定義的數(shù)據(jù)結(jié)構(gòu)化協(xié)議確定本次通信過程中的幀頭(0x5a,0x54)及幀尾(0x5a,0xfe)以及數(shù)據(jù)區(qū)的有效字節(jié)個數(shù)(例如4),將離散數(shù)據(jù)流中的每個數(shù)據(jù)按順序依次排列到幀頭之后,若數(shù)據(jù)中出現(xiàn)與幀尾一致的數(shù)據(jù),則在該數(shù)據(jù)前插入一個轉(zhuǎn)義字符,直至數(shù)據(jù)區(qū)有效字節(jié)排列完畢;(2.2)根據(jù)數(shù)據(jù)區(qū)內(nèi)的數(shù)據(jù)確定校驗碼,填寫校驗區(qū);(2.3)根據(jù)數(shù)據(jù)區(qū)的有效字節(jié)個數(shù)、轉(zhuǎn)義字符的個數(shù)計算數(shù)據(jù)長度并占用1個字節(jié);(2.4)在數(shù)據(jù)長度之后排列(2.1)中確定的幀尾,得到一個數(shù)據(jù)幀。當所發(fā)送的數(shù)據(jù)中不含幀尾數(shù)據(jù)時,打包數(shù)據(jù)幀時不需要插入轉(zhuǎn)義符,如要求發(fā)送4個數(shù)據(jù)如下:0x010x020x030x04按照本發(fā)明所述數(shù)據(jù)結(jié)構(gòu)化協(xié)議組成發(fā)送幀如下:當所發(fā)送的數(shù)據(jù)中包含幀尾時,打包數(shù)據(jù)幀時需要插入轉(zhuǎn)義符,如要求發(fā)送4個數(shù)據(jù):0x10x5a0xfe0x4按本協(xié)議要求組成發(fā)送幀如下:其中用陰影標識的0x00即為插入的轉(zhuǎn)義字符,它并不是有效的數(shù)據(jù),接收方在接收后應(yīng)將其刪除,而只保留其它4個數(shù)據(jù);長度因為插入轉(zhuǎn)義字符,也由4增加到5,實際解析過程中,數(shù)據(jù)長度應(yīng)從5中減去插入的轉(zhuǎn)義字符個數(shù),即5-1=4。(3)接收方以查詢或中斷方式將接收到的數(shù)據(jù)幀存入緩沖隊列中,然后根據(jù)數(shù)據(jù)的結(jié)構(gòu)化協(xié)議對緩沖隊列中的數(shù)據(jù)幀進行提取和解析,從而獲取數(shù)據(jù)幀中的有效數(shù)據(jù),此過程必須識別一個完整合格幀,識別完整合格幀必須同時具備如下條件:a)收到合格的幀尾標識;b)收到幀頭標識;c)校驗碼正確。具體的提取和解析步驟如下:(3.1)從緩沖隊列頭開始向后,遍歷每個元素,直到找到一個數(shù)據(jù)幀幀尾;(3.2)從幀尾位置沿隊列向前移動一個字節(jié)找到數(shù)據(jù)長度字段以及校驗區(qū);(3.3)根據(jù)數(shù)據(jù)長度計算出幀頭所在的位置,并沿隊列向前找到幀頭位置的隊列元素值,校驗幀頭的正確性,若正確,則轉(zhuǎn)(3.4),否則將幀尾之前的所有數(shù)據(jù)作為錯誤數(shù)據(jù)進行處理,并從緩沖隊列中刪除,轉(zhuǎn)步驟(3.5);(3.4)根據(jù)幀頭的位置獲取緩沖隊列中緊隨其后的數(shù)據(jù)區(qū)的數(shù)據(jù),根據(jù)數(shù)據(jù)區(qū)的數(shù)據(jù)計算校驗碼,并與(3.2)中校驗區(qū)中的校驗碼進行校核,若二者一致,則提取數(shù)據(jù)區(qū)內(nèi)的有效數(shù)據(jù)及確定有效數(shù)據(jù)的長度,并將幀頭至幀尾所有數(shù)據(jù)從緩沖隊列中刪除,完成本數(shù)據(jù)幀的提?。环駝t,將幀尾之前的所有數(shù)據(jù)作為錯誤數(shù)據(jù)進行處理,并從緩沖隊列中刪除,轉(zhuǎn)步驟(3.5);上述提取數(shù)據(jù)區(qū)內(nèi)的有效數(shù)據(jù),由于引入轉(zhuǎn)義字符后,發(fā)送的數(shù)據(jù)幀與轉(zhuǎn)義前相比可能會出現(xiàn)兩個變化,一是數(shù)據(jù)區(qū)里除有效的數(shù)據(jù)外,還可能存在轉(zhuǎn)義字符’\x0’,因此,要求接收方需對數(shù)據(jù)區(qū)的轉(zhuǎn)義字符進行剔除,即如果在數(shù)據(jù)區(qū)出現(xiàn)“0+0x5a+0xfe”,則用“0x5a+0xfe”代替。接收方確定有效數(shù)據(jù)長度時,由于引入轉(zhuǎn)義字符后,數(shù)據(jù)長度字段的內(nèi)容是有效數(shù)據(jù)的個數(shù)加上增加轉(zhuǎn)義字符的個數(shù),因此,計算數(shù)據(jù)有效長度時也應(yīng)將轉(zhuǎn)義的個數(shù)剔除。(3.5)判斷緩沖隊列是否為空,若不為空,則轉(zhuǎn)步驟(3.1),否則處理結(jié)束。本發(fā)明未詳細描述內(nèi)容為本領(lǐng)域技術(shù)人員公知技術(shù)。當前第1頁12