一種基于數(shù)據(jù)流傳輸?shù)臄?shù)據(jù)包提取方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及基于數(shù)據(jù)流傳輸?shù)臄?shù)據(jù)包提取方法。
【背景技術(shù)】
[0002] 在嵌入式系統(tǒng)中,很多通信接口可以提供一種數(shù)據(jù)流傳輸?shù)墓δ?,如串口、SPI總 線等,這種通信接口能夠以數(shù)據(jù)為單位進(jìn)行信息傳遞。一個(gè)完整的數(shù)據(jù)包通過這種通信接 口后,會轉(zhuǎn)化為數(shù)據(jù)流的形式進(jìn)行傳輸,數(shù)據(jù)接收端需在數(shù)據(jù)流中將數(shù)據(jù)包完整無誤地提 取出來。與PC相比,嵌入式系統(tǒng)中RAM容量小、CPU主頻低。但實(shí)際應(yīng)用中系統(tǒng)資源占用 大、運(yùn)算量大以及因硬件故障造成的數(shù)據(jù)包串位現(xiàn)象;所以,在嵌入式系統(tǒng)中,一種系統(tǒng)資 源占用少、運(yùn)算量小,避免因硬件故障造成的數(shù)據(jù)包串位的數(shù)據(jù)包提取方法是必須的。
【發(fā)明內(nèi)容】
[0003] 本發(fā)明的目的是為了解決現(xiàn)有系統(tǒng)資源占用大、運(yùn)算量大以及因硬件故障造成的 數(shù)據(jù)包串位現(xiàn)象的問題,而提出了 一種基于數(shù)據(jù)流傳輸?shù)臄?shù)據(jù)包提取方法。
[0004] 上述的發(fā)明目的是通過以下技術(shù)方案實(shí)現(xiàn)的:
[0005] 步驟1、初始化各變量,執(zhí)行解包進(jìn)度等于0,隊(duì)列頭位置等于緩存首位置,隊(duì)列尾 位置等于緩存首位置,同步字位置等于空值,數(shù)據(jù)包位置等于空值;
[0006] 步驟2、若接收隊(duì)列中存在數(shù)據(jù),則讀取接收數(shù)據(jù),賦值隊(duì)列尾位置的數(shù)據(jù)等于接 收數(shù)據(jù),隊(duì)列尾位置等于隊(duì)列尾位置+1,當(dāng)前接收數(shù)據(jù)的長度等于隊(duì)列尾位置減去隊(duì)列頭 位置,執(zhí)行步驟3;
[0007] 若接收隊(duì)列中不存在數(shù)據(jù),則執(zhí)行步驟5 ;
[0008] 步驟3、判斷解包進(jìn)度值,若解包進(jìn)度等于0,執(zhí)行步驟4. 0. 1 ;
[0009] 若解包進(jìn)度等于1,執(zhí)行步驟4. 1. 1 ;
[0010] 若解包進(jìn)度等于2,執(zhí)行步驟4. 2. 1;
[0011] 步驟4. 0. 1、若當(dāng)前接收數(shù)據(jù)的長度大于等于同步字長度,則執(zhí)行步驟4. 0. 2,
[0012] 若當(dāng)前接收數(shù)據(jù)的長度小于同步字長度,則執(zhí)行步驟2 ;
[0013] 步驟4. 0.2、在隊(duì)列頭位置到隊(duì)列尾位置之間尋找同步字,若尋找到,設(shè)尋找到的 位置為尋找到的同步字位置,執(zhí)行步驟4. 0. 3;
[0014] 若沒尋找到,執(zhí)行步驟4.0?4;
[0015] 步驟4. 0. 3、賦值解包進(jìn)度等于1,同步字位置等于尋找到的同步字位置,數(shù)據(jù)包 位置等于同步字位置加同步字長度,執(zhí)行步驟2;
[0016] 步驟4. 0. 4、賦值隊(duì)列頭位置等于隊(duì)列頭位置加1,若隊(duì)列頭位置大于等于重更新 緩存閾值,則執(zhí)行步驟4. 0. 5;
[0017] 若隊(duì)列頭位置小于重更新緩存閾值,執(zhí)行步驟2 ;
[0018] 步驟4. 0. 5、復(fù)制隊(duì)列尾位置減同步字長度加1位置同步字長度減1個(gè)數(shù)據(jù)到緩存 首位置位置,賦值隊(duì)列頭位置等于緩存首位置(,隊(duì)列尾位置等于隊(duì)列頭位置加同步字長度 減1,執(zhí)行步驟2 ;
[0019] 步驟4. 1. 1、若當(dāng)前接收數(shù)據(jù)的長度大于等于同步字長度加2,則執(zhí)行步驟4. 1. 2 ;
[0020] 若當(dāng)前接收數(shù)據(jù)的長度小于同步字長度加2,則執(zhí)行步驟2 ;
[0021] 步驟4. 1. 2、若數(shù)據(jù)包位置長度位校驗(yàn)成功,賦值解包進(jìn)度等于2,然后執(zhí)行步驟 2,
[0022] 若數(shù)據(jù)包位置長度位校驗(yàn)不成功,賦值解包進(jìn)度等于0,隊(duì)列頭位置等于隊(duì)列頭位 置加1,然后執(zhí)行步驟2;
[0023] 步驟4. 2. 1、若當(dāng)前接收數(shù)據(jù)的長度大于等于同步字長度加數(shù)據(jù)包位置的第一個(gè) 數(shù)據(jù),則執(zhí)行步驟4. 2. 2;
[0024] 若當(dāng)前接收數(shù)據(jù)的長度小于同步字長度加數(shù)據(jù)包位置的第一個(gè)數(shù)據(jù),則執(zhí)行步驟 2 ;
[0025] 步驟4. 2. 2、若數(shù)據(jù)包位置數(shù)據(jù)包校驗(yàn)成功,執(zhí)行步驟4. 2. 3;
[0026] 若數(shù)據(jù)包位置數(shù)據(jù)包校驗(yàn)不成功,執(zhí)行步驟4. 2. 4;
[0027] 步驟4. 2. 3、復(fù)制數(shù)據(jù)包位置處數(shù)據(jù)包位置的第一個(gè)數(shù)據(jù)數(shù)目的數(shù)據(jù)到交換緩存 區(qū),設(shè)置數(shù)據(jù)包接收標(biāo)志,賦值解包進(jìn)度等于〇,隊(duì)列頭位置等于緩存首位置,隊(duì)列尾位置等 于緩存首位置,執(zhí)行步驟5;
[0028] 步驟4. 2. 4、賦值解包進(jìn)度等于0,隊(duì)列頭位置等于隊(duì)列頭位置加1,執(zhí)行步驟2;
[0029] 步驟5、退出程序。
[0030] 發(fā)明效果
[0031] 采用本發(fā)明的一種基于數(shù)據(jù)流傳輸?shù)臄?shù)據(jù)包提取方法,
[0032] 本發(fā)明針對數(shù)據(jù)包格式和數(shù)據(jù)流傳輸?shù)奶攸c(diǎn),提供了一種數(shù)據(jù)包提取算法,該算 法可以在數(shù)據(jù)流中提取數(shù)據(jù)包,采用基于隊(duì)列存儲結(jié)構(gòu)實(shí)現(xiàn),隊(duì)列存儲結(jié)構(gòu)采用非循環(huán)結(jié) 構(gòu),降低運(yùn)算量,達(dá)到系統(tǒng)資源占用內(nèi)存小,運(yùn)算量?。粚﹀e(cuò)誤數(shù)據(jù)采用逐數(shù)據(jù)刪除的方式, 避免了因硬件故障造成的數(shù)據(jù)包串位現(xiàn)象;各變量具有明確意義,調(diào)試方便。解決了現(xiàn)有系 統(tǒng)資源占用大、運(yùn)算量大以及因硬件故障造成的數(shù)據(jù)包出現(xiàn)串位現(xiàn)象的問題,使系統(tǒng)資源 占用減少30%以上,運(yùn)算量減少40%以上。
【附圖說明】
[0033] 圖1為初始化賦值示意圖;
[0034] 圖2為主體流程圖,子步驟0為步驟4. 0. 1-4. 0. 5,子步驟1為步驟4. 1. 1-4. 1. 2, 子步驟2為步驟4. 2. 1-4. 2. 4;
[0035] 圖3為子步驟0流程圖;
[0036] 圖4為子步驟1流程圖;
[0037] 圖5為子步驟2流程圖;
[0038] 圖6為實(shí)施例中發(fā)送數(shù)據(jù)內(nèi)容圖;
[0039] 圖7a為數(shù)據(jù)包處理前buffer緩存中存儲的數(shù)據(jù)圖;
[0040] 圖7b為數(shù)據(jù)包處理前其余變量的狀態(tài)圖;
[0041] 圖8a為數(shù)據(jù)包處理后buffer緩存中存儲的數(shù)據(jù)圖;
[0042] 圖8b為數(shù)據(jù)包處理后其余變量的狀態(tài)圖。
【具體實(shí)施方式】
【具體實(shí)施方式】 [0043] 一:一種基于數(shù)據(jù)流傳輸?shù)臄?shù)據(jù)包提取方法具體是按照以下步驟進(jìn) 行的:
[0044] 步驟1、如圖1所示,初始化各變量,執(zhí)行解包進(jìn)度等于0(state= 0),隊(duì)列頭位置 等于緩存首(front=buffer),隊(duì)列尾位置等于緩存首(rear=buffer),同步字位置等于 空值(sync=NULL),數(shù)據(jù)包位置等于空值(package=NULL),各變量為解包進(jìn)度(state)、 隊(duì)列頭位置(front)、緩存首位置(buffer)、隊(duì)列尾位置(rear)、同步字位置(sync)、(空 值)NULL和數(shù)據(jù)包位置(package);
[0045]步驟2、若接收隊(duì)列中存在數(shù)據(jù),則讀取數(shù)據(jù)接收的數(shù)據(jù)(c),賦值隊(duì)列尾位置的 數(shù)據(jù)等于接收的數(shù)據(jù)(*rear=c),隊(duì)列尾位置等于隊(duì)列尾位置+1(rear=rear+1),當(dāng)前 接收數(shù)據(jù)的長度等于隊(duì)列尾位置-隊(duì)列頭位置(recv_length=rear-front),執(zhí)行步驟3;
[0046] 若接收隊(duì)列中不存在數(shù)據(jù),則執(zhí)行步驟5 ;
[0047] 步驟3、如圖2所示,判斷解包進(jìn)度(state)值,若解包進(jìn)度等于0(state= 0),執(zhí) 行步驟4. 0. 1;
[0048]若解包進(jìn)度等于1(state= 1),執(zhí)行步驟4. 1. 1;
[0049]若解包進(jìn)度等于2(state= 2),執(zhí)行步驟4. 2. 1;
[0050] 步驟4.0. 1、如圖3所示,若當(dāng)前接收數(shù)據(jù)的長度大于等于同步字長度(reCV_ length〉=PACK_SYNC_LEN),則執(zhí)行步驟4.0? 2,
[0051]若當(dāng)前接收數(shù)據(jù)的長度小于同步字長度(reCV_length<PACK_SYNC_LEN),則執(zhí) 行步驟2;
[0052] 步驟4.0.2、在隊(duì)列頭位置(front)到隊(duì)列尾位置(rear)之間尋找同步字(PACK_ SYNC),若尋找到,設(shè)尋找到的位置為尋找到的同步字位置(pos),執(zhí)行步驟4.0.3;
[0053] 若沒尋找到,執(zhí)行步驟4.0?4;
[0054]步驟4. 0. 3、賦值解包進(jìn)度等于1 (state=1),同步字位置等于尋找到的同步字位 置(sync=pos),數(shù)據(jù)包位置等于同步字位置加同步字長度(package=sync+PACK_SYNC_ LEN),執(zhí)行步驟2 ;
[0055] 步驟4. 0. 4、賦值隊(duì)列頭位置等于隊(duì)列頭位置加1(front=front+1),若隊(duì)列頭位 置大于等于重更新緩存閾值(front〉=REN