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