串口指令解碼方法
【專利摘要】本發(fā)明涉及通訊【技術(shù)領(lǐng)域】,特別涉及一種串口指令解碼方法,包括如下步驟:根據(jù)命令的個(gè)數(shù)m以及單個(gè)命令的最大長度n建立二維字節(jié)型數(shù)組arrCmdValue[m][n],同時(shí)建立一維整數(shù)型數(shù)組arrCmdSize[m]用于保存每條指令的長度,建立一維布爾型數(shù)組arrCmdFlag[m];將數(shù)組arrCmdFlag[m]初始化為“真值”;讀取串口數(shù)據(jù)并進(jìn)行比較,同時(shí)根據(jù)比較結(jié)果相應(yīng)地修改數(shù)組arrCmdFlag[m]的值;對(duì)滿足要求的命令進(jìn)行解析并執(zhí)行。本方法運(yùn)算次數(shù)少,增加識(shí)別速度、準(zhǔn)確性,該解碼步驟僅在接收方進(jìn)行,無需事先約定格式協(xié)議,對(duì)于任意串口數(shù)據(jù),都能可靠解碼。
【專利說明】串口指令解碼方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明設(shè)及通訊【技術(shù)領(lǐng)域】,特別設(shè)及一種串口指令解碼方法。
【背景技術(shù)】
[0002] 串行通訊是工控場(chǎng)合比較常用的經(jīng)濟(jì)、有效的數(shù)據(jù)傳輸方法,比如RS232, RS422 或RS485。由于該些硬件協(xié)議是面向字節(jié)型的,一次收發(fā)的基本單元都是8位數(shù)據(jù).為了 能夠一次性傳輸一條8位的命令W及超過8位長度的數(shù)據(jù),常采用的方法是通信雙方事先 約定一套通信協(xié)議。系統(tǒng)采用數(shù)據(jù)打包方式進(jìn)行傳輸,將數(shù)據(jù)編輯成帖格式;定長的或變長 的,發(fā)送和接收方按照約定的格式協(xié)議進(jìn)行編帖和解帖。帖中包含了多個(gè)組成部分。簡(jiǎn)單 的帖格式包括帖頭域、數(shù)據(jù)域W及校驗(yàn)和,包括該個(gè)帖的帖首、帖結(jié)束、帖類型、地址、數(shù)據(jù)、 錯(cuò)誤冗余等,該些部分并不全是必需的。不同設(shè)備的通信格式與數(shù)據(jù)各不相同,如何提取有 效的數(shù)據(jù)帖并進(jìn)行校驗(yàn)和解碼是獲取數(shù)據(jù)的重點(diǎn)之一;同時(shí),現(xiàn)有技術(shù)中需要發(fā)送方和接 收方事先約定格式協(xié)議,該樣就缺乏通用性。
【發(fā)明內(nèi)容】
[0003] 本發(fā)明的目的在于提供一種串口指令解碼方法,直接進(jìn)行可靠正確的解碼,無需 約定格式協(xié)議。
[0004] 為實(shí)現(xiàn)W上目的,本發(fā)明采用的技術(shù)方案為:一種串口指令解碼方法,包括 如下步驟;(A)根據(jù)命令的個(gè)數(shù)mW及單個(gè)命令的最大長度n建立二維字節(jié)型數(shù)組 arrCmdValue虹][n],同時(shí)建立一維整數(shù)型數(shù)組arrCmdSize虹]用于保存每條指令的 長度,建立一維布爾型數(shù)組arrCmdFlag虹];炬)將數(shù)組arrCmdFlag虹]初始化為"真 值";(C)讀取串口數(shù)據(jù)并與數(shù)組arrCmdValue虹][n]的第一列進(jìn)行逐行比較,若串口數(shù) 據(jù)與數(shù)組arrCmdValue虹][n]的第一列數(shù)據(jù)完全不同,返回步驟C,若串口數(shù)據(jù)與數(shù)組 arrCmdValue虹][n]的第一列數(shù)據(jù)部分相同或完全相同,進(jìn)入步驟D ;值)數(shù)據(jù)不同的行X, 對(duì)應(yīng)的arrCmdFlag[x]置為"假值";數(shù)據(jù)相同的行y,若arrCmdSize[y]的值為1,則命令 解析完畢執(zhí)行相應(yīng)命令,否則進(jìn)入步驟E ;巧)讀取串口數(shù)據(jù)并與數(shù)組arrCmdValue虹][n] 的后續(xù)列中arrCmdFlag虹]為"真值"的行進(jìn)行逐行比較,若后續(xù)列為第(n+1)列,返回步 驟B,否則,若串口數(shù)據(jù)與數(shù)組arrCmdValue虹][n]的該列數(shù)據(jù)完全不同,返回步驟B,若串 口數(shù)據(jù)與數(shù)組arrCmdValue虹][n]的該列數(shù)據(jù)部分相同或完全相同,進(jìn)入步驟F;(巧數(shù) 據(jù)不同的行X,對(duì)應(yīng)的arrCmdFlag[x]置為"假值";數(shù)據(jù)相同的行y,若arrCmdSize[y]的 值等于對(duì)應(yīng)列數(shù),則命令解析完畢執(zhí)行相應(yīng)命令,否則重復(fù)步驟E ;其中,arrCmdValue[i] [0]、a;rrCmdValue[i][l]、--?、a;rrCmdValue[i][n-l]構(gòu)成數(shù)組 arrCmdValue虹][n]的第 (i+1)行,arrCmdValue[0] [j]、arrCmdValue[1] [j]、…、arrCmdValue虹-1] [j]構(gòu)成數(shù)組 arrCmdValue 虹][n]的第(j+1)列。
[0005] 與現(xiàn)有技術(shù)相比,本發(fā)明存在W下技術(shù)效果;通過設(shè)置數(shù)組arrCmdFlag虹]來排 除不符合要求的指令,減少運(yùn)算次數(shù),增加識(shí)別速度;同時(shí),設(shè)置數(shù)組arrCmdSize虹]判定 是否解析指令,避免某些執(zhí)行的誤執(zhí)行,增加識(shí)別的準(zhǔn)確性,該解碼步驟僅在接收方進(jìn)行, 無需事先約定格式協(xié)議,對(duì)于任意串口數(shù)據(jù),都能可靠解碼。
【具體實(shí)施方式】
[0006] 下面對(duì)本發(fā)明做進(jìn)一步詳細(xì)敘述。
[0007] 一種串口指令解碼方法,包括如下步驟;(A)根據(jù)命令的個(gè)數(shù)m W及單個(gè)命 令的最大長度n建立二維字節(jié)型數(shù)組arrCmdValue虹][n],同時(shí)建立一維整數(shù)型數(shù)組 arrCmdSize虹]用于保存每條指令的長度,建立一維布爾型數(shù)組arrCmdFlag虹]。為了清楚 地描述該步驟,假設(shè)現(xiàn)在有500條指令,單個(gè)指令的最大長度為100,命令表如下:
[0008] (表 1)
[0009]
【權(quán)利要求】
1. 一種串口指令解碼方法,包括如下步驟: (A) 根據(jù)命令的個(gè)數(shù)m以及單個(gè)命令的最大長度n建立二維字節(jié)型數(shù)組 arrCmdValue[m] [n],同時(shí)建立一維整數(shù)型數(shù)組arrCmdSize [m]用于保存每條指令的長度, 建立一維布爾型數(shù)組arrCmdFlag[m]; (B) 將數(shù)組arrCmdFlag[m]初始化為"真值"; (C) 讀取串口數(shù)據(jù)并與數(shù)組arrCmdValue[m][n]的第一列進(jìn)行逐行比較, 若串口數(shù)據(jù)與數(shù)組arrCmdValue[m] [n]的第一列數(shù)據(jù)完全不同,返回步驟C, 若串口數(shù)據(jù)與數(shù)組arrCmdValueDn] [n]的第一列數(shù)據(jù)部分相同或完全相同,進(jìn)入步驟 D ; (D) 數(shù)據(jù)不同的行X,對(duì)應(yīng)的arrCmdFlag[x]置為"假值";數(shù)據(jù)相同的行y,若 arrCmdSize [y]的值為1,則命令解析完畢執(zhí)行相應(yīng)命令,否則進(jìn)入步驟E; (E) 讀取串口數(shù)據(jù)并與數(shù)組arrCmdValue[m] [n]的后續(xù)列中arrCmdFlag[m]為"真值" 的行進(jìn)行逐行比較,若后續(xù)列為第(n+1)列,返回步驟B,否則, 若串口數(shù)據(jù)與數(shù)組arrCmdValue[m] [n]的該列數(shù)據(jù)完全不同,返回步驟B, 若串口數(shù)據(jù)與數(shù)組arrCmdValueDn] [n]的該列數(shù)據(jù)部分相同或完全相同,進(jìn)入步驟F ; (F) 數(shù)據(jù)不同的行X,對(duì)應(yīng)的arrCmdFlag[x]置為"假值";數(shù)據(jù)相同的行y,若 arrCmdSize [y]的值等于對(duì)應(yīng)列數(shù),則命令解析完畢執(zhí)行相應(yīng)命令,否則重復(fù)步驟E ; 其中,arrCmdValue[i] [0]、arrCmdValue[i] [1]、…、arrCmdValue[i] [n_l]構(gòu)成數(shù) 組 arrCmdValue[m] [n]的第(i+1)行,arrCmdValue[0] [j]、arrCmdValue[1] [j]、…、 arrCmdValue[m-l][j]構(gòu)成數(shù)組 arrCmdValue[m][n]的第(j+1)列。
【文檔編號(hào)】G06F13/42GK104503942SQ201410842438
【公開日】2015年4月8日 申請(qǐng)日期:2014年12月30日 優(yōu)先權(quán)日:2014年12月30日
【發(fā)明者】曹明潤, 徐勇, 汪升 申請(qǐng)人:合肥金星機(jī)電科技發(fā)展有限公司