一種串口通訊數(shù)據(jù)處理分析方法
【技術(shù)領(lǐng)域】
[0001 ] 本發(fā)明涉及一種新型的串口通訊數(shù)據(jù)處理分析方法,屬于數(shù)據(jù)傳輸技術(shù)領(lǐng)域。
【背景技術(shù)】
[0002] 在目前很多的工程化控制應(yīng)用中,大部分采用了PC機和多臺單片機構(gòu)成的主從 系統(tǒng);單片機主要進行數(shù)據(jù)采集,處理現(xiàn)場信號,驅(qū)動執(zhí)行機構(gòu);PC機則通過對單片機進行 集中管理,完成信息顯示,數(shù)據(jù)運算并做出決策以分配任務(wù)。PC機與單片機之間則需通過通 訊方式完成數(shù)據(jù)交互,在眾多通訊接口中,串口通訊應(yīng)用比較普遍。
[0003] 串口通訊有RS232、RS422和RS485三種方式,按照字節(jié)流的方式來進行,即每中斷 一次,表明成功傳送或者接收一個字節(jié);但是,由于RS232、RS422和RS485等串口通訊存在 不可靠、不穩(wěn)定的問題,因此需要提供一種新的串口通訊數(shù)據(jù)處理方法。
【發(fā)明內(nèi)容】
[0004] 有鑒于此,本發(fā)明的目的是針對現(xiàn)有技術(shù)的不足,提出一種新型的串口通訊數(shù)據(jù) 處理分析方法,該方法可以有效提高串口通訊的穩(wěn)定性。
[0005] 實現(xiàn)本發(fā)明的技術(shù)方案如下:
[0006] 一種串口通訊數(shù)據(jù)處理分析方法,數(shù)據(jù)存儲時,將通訊數(shù)據(jù)存儲于大小為SIZE的 循環(huán)先進先出環(huán)形緩沖區(qū)中,緩沖區(qū)中Tail指針表示該緩沖區(qū)中接收到的有效數(shù)據(jù)位置, Head指針表示該緩沖區(qū)中已經(jīng)處理的有效數(shù)據(jù)位置,HeadBak指針為Head指針的備份;數(shù) 據(jù)寫入時,首先判斷緩沖區(qū)是否寫滿,若Tail不等于Head,則表示緩沖區(qū)不滿,寫入數(shù)據(jù); 否則,不能寫入;
[0007] 數(shù)據(jù)讀出處理分析時采用如下步驟進行:
[0008] 步驟一、讀取緩沖區(qū)數(shù)據(jù)進行前導(dǎo)碼檢查,若該數(shù)據(jù)與通信協(xié)議中預(yù)設(shè)的前導(dǎo)碼 不相等,則表明該數(shù)據(jù)不是前導(dǎo)碼,丟棄該數(shù)據(jù),讀取下一個數(shù)據(jù)繼續(xù)進行前導(dǎo)碼檢查,直 到讀取數(shù)據(jù)與預(yù)設(shè)的前導(dǎo)碼相等,即獲得前導(dǎo)碼,轉(zhuǎn)入步驟二;
[0009] 步驟二、讀取緩沖區(qū)中下一個數(shù)據(jù)進行幀長度檢查,若該數(shù)據(jù)不滿足通信協(xié)議中 對長度域可能出現(xiàn)的最大和最小包長要求,則表明該數(shù)據(jù)不是幀長度,丟棄該數(shù)據(jù),讀取下 一個數(shù)據(jù)繼續(xù)進行幀長度檢查,直到讀取數(shù)據(jù)滿足通信協(xié)議要求,即獲得幀長度,轉(zhuǎn)入步驟 -* ? -?,
[0010] 步驟三、讀取緩沖區(qū)中下一個數(shù)據(jù)進行幀號檢查,若該數(shù)據(jù)與通信協(xié)議中預(yù)設(shè)的 幀號不相等,則表明該數(shù)據(jù)不是幀號,丟棄該數(shù)據(jù),讀取下一個數(shù)據(jù)繼續(xù)進行幀號檢查,直 到讀取數(shù)據(jù)與預(yù)設(shè)的幀號相等,即獲得幀號,并令HeadBak等于Head,轉(zhuǎn)入步驟四;
[0011] 步驟四、根據(jù)步驟二獲得的幀長度數(shù)據(jù),連續(xù)讀取幀長度所述長度的數(shù)據(jù)作為數(shù) 據(jù)域數(shù)據(jù),轉(zhuǎn)入步驟五;
[0012] 步驟五,按照通信協(xié)議對步驟四獲得的數(shù)據(jù)域數(shù)據(jù)進行校驗和檢查,若校驗和錯 誤,則表明讀取的數(shù)據(jù)域中有數(shù)據(jù)有誤,放棄此次讀取的數(shù)據(jù)域數(shù)據(jù),令Head=HeadBak, 轉(zhuǎn)入步驟一,即從HeadBak所示位置開始重新執(zhí)行步驟一~步驟五,進行數(shù)據(jù)讀取分析;若 校驗和正確,則讀?。℉ead-HeadBak+SIZE) %SIZE的長度數(shù)據(jù),然后根據(jù)幀號,執(zhí)行相應(yīng)的 操作。
[0013] 有益效果
[0014] (1)本發(fā)明采用循環(huán)先進先出環(huán)形緩沖區(qū)進行數(shù)據(jù)存儲,能夠利用循環(huán)FIFO緩沖 區(qū)的特性,提供對數(shù)據(jù)的緩存和對字節(jié)流數(shù)據(jù)靈活多樣的訪問方式;在讀取數(shù)據(jù)時,分別依 次對協(xié)議的各個域(前導(dǎo)碼、幀長度、幀號、數(shù)據(jù)域、校驗和)進行嚴格的檢查,實現(xiàn)對部分 含有錯誤域的包和不完整的包的完美過濾,以及對混亂數(shù)據(jù)中正確包準確無誤的抽取,減 少數(shù)據(jù)幀(即報文)讀取時由于數(shù)據(jù)錯誤提取帶來的對報文的錯誤解讀。
[0015] ⑵采用HeadBak對Head進行備份,當(dāng)幀頭分析結(jié)束后(即提取完幀號后),記錄 下Head的位置,以防后續(xù)數(shù)據(jù)不符合協(xié)議要求后,根據(jù)HeadBak重新恢復(fù)Head的位置,從 而防止前導(dǎo)碼等信息漏查。
【附圖說明】
[0016] 圖1為通訊協(xié)議結(jié)構(gòu)。
[0017] 圖2為循環(huán)FIFO緩沖區(qū)示意。
[0018] 圖3為本發(fā)明流程圖。
【具體實施方式】
[0019] 下面結(jié)合具體實例對本發(fā)明作進一步詳細說明。
[0020] 本發(fā)明一種新型的串口通訊數(shù)據(jù)處理分析方法,具體過程為:
[0021] (一)定義通訊協(xié)議
[0022] 串口通訊協(xié)議一般包含這樣幾個域:幀頭、用戶數(shù)據(jù)和幀尾,其中,幀頭包括前導(dǎo) 碼、幀長度和幀號;用戶數(shù)據(jù)對應(yīng)數(shù)據(jù)域;幀尾為校驗和。
[0023] (二)循環(huán)FIFO(先進先出)環(huán)形緩沖區(qū)
[0024] 本發(fā)明采用環(huán)形緩沖區(qū)作為數(shù)據(jù)結(jié)構(gòu)來存放通信中發(fā)送和接收的數(shù)據(jù)。環(huán)形緩沖 區(qū)是一個先進先出的循環(huán)緩沖區(qū),可以向通信程序提供對緩沖區(qū)的互斥訪問。環(huán)形緩沖區(qū) 有一個讀指針和一個寫指針。讀指針指向環(huán)形緩沖區(qū)中可讀的數(shù)據(jù),寫指針指向環(huán)形緩沖 區(qū)中可寫的緩沖區(qū)。通過移動讀指針和寫指針就可以實現(xiàn)緩沖區(qū)的數(shù)據(jù)讀取和寫入。在通 常情況下,環(huán)形緩沖區(qū)的讀數(shù)據(jù)僅僅會影響讀指針,而寫數(shù)據(jù)僅僅會影響寫指針。
[0025] 采用具有先進先出功能的循環(huán)FIFO環(huán)形緩沖區(qū)進行串口數(shù)據(jù)接收和發(fā)送,如圖2 所示。
[0026] 從圖2中可以看出,先進先出功能的FIFO緩沖區(qū)須定義一個大小為SIZE的緩 沖區(qū),存放數(shù)據(jù),Tail指針表示該緩沖區(qū)中接收到的有效數(shù)據(jù)位置,表示寫入的數(shù)據(jù)位 置;Head指針表示該緩沖區(qū)中已經(jīng)處理的有效數(shù)據(jù)位置,表示讀出的數(shù)據(jù)位置;初始化時, Head指針和Tail指針都指到0的位置;當(dāng)串口接收到數(shù)據(jù)存放到緩沖區(qū)后,Tail就加1, 當(dāng)Tail大于SIZE-I時,將Tail更新為0,數(shù)據(jù)接收時,線性緩沖區(qū)變成一個回環(huán);當(dāng)系統(tǒng)從 緩沖區(qū)取出一個數(shù)據(jù)進行分析,Head就加1,當(dāng)Head大于SIZE-I時,將Head更新0,數(shù)據(jù) 分析時,線性緩沖區(qū)也變成一個回環(huán);依據(jù)這種方法,可以看出,數(shù)據(jù)先到的,數(shù)據(jù)先分析, 建立了先進先出功能的FIFO循環(huán)緩沖區(qū)。
[0027] 這個結(jié)構(gòu)體很簡單,Tail表示寫入的數(shù)據(jù)位置,Head表示讀出的數(shù)據(jù)位置。在對 Head和Tail修改時,需要對SIZE取模,防止溢出。SIZE-般根據(jù)串口采用的波特率、數(shù)據(jù) 流量和計算機的處理速度來決定大小。
[0028] (三)緩沖區(qū)數(shù)據(jù)的操作
[0029] 根據(jù)FIFO的方式實現(xiàn)緩沖區(qū)的初始化、寫入和讀出的操作時,需要注意以下幾 占.
[0030] 1)緩沖區(qū)的有效數(shù)據(jù)長度
[0031] 緩沖區(qū)的有效數(shù)據(jù)長度表示在緩沖區(qū)中存在的沒有及時處理的數(shù)據(jù)長度;可以這 樣計算:(Tail+SIZE-Head) %SIZEo
[0032] 2)緩沖區(qū)的可以寫入數(shù)據(jù)長度
[0033] 緩沖區(qū)的可以寫入數(shù)據(jù)長度表示在當(dāng)前緩沖區(qū)中還能寫入的數(shù)據(jù)長度;可以這樣 計算:SIZE-(