一種解碼方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本申請涉及電子信息領(lǐng)域,尤其涉及一種解碼方法及裝置。
【背景技術(shù)】
[0002]相比于使用解碼電路進行解碼的方式而言,使用處理器解碼的方式更為滿足低功耗的要求。
[0003]現(xiàn)有的使用處理器進行解碼的方式,在檢測到電平的變化時,產(chǎn)生中斷,進行解碼。
[0004]而對于工業(yè)總線型的應(yīng)用場景而言,在此情況下,處理器不可能支持處理頻繁的中斷解碼。例如,曼徹斯特碼在總線供電的應(yīng)用中經(jīng)常采用,如符合IEC61158-2標準的PROFIBUS-PA和FF-Hl現(xiàn)場智能設(shè)備。總線供電對處理器的功耗有較高要求,一般處理器的主頻不超過20MHz。曼徹斯特碼的頻率一般固定為31.25kHz,可見,現(xiàn)有的處理器解碼方式并不適用于主頻較低的處理器,因此,如何使用主頻較低的處理器進行解碼成為目前亟待解決的問題。
[0005]申請內(nèi)容
[0006]本申請?zhí)峁┝艘环N解碼方法及裝置,目的在于解決如何使用主頻較低的處理器進行解碼的問題。
[0007]為了實現(xiàn)上述目的,本申請?zhí)峁┝艘韵录夹g(shù)方案:
[0008]一種解碼方法,包括:
[0009]對接收到的編碼進行采樣;
[0010]將采樣得到的數(shù)據(jù)序列存儲到接收隊列;
[0011]在所述接收隊列中的數(shù)據(jù)序列的幀數(shù)達到第一數(shù)值后,產(chǎn)生解碼中斷;
[0012]在本次中斷周期,對所述接收隊列中的數(shù)據(jù)幀進行解碼。
[0013]可選地,所述對所述接收隊列中的數(shù)據(jù)幀進行解碼包括:
[0014]判斷所述接收隊列中的數(shù)據(jù)幀是否為全O或全1,如果否,則對所述數(shù)據(jù)幀進行解碼,如果所述本次解碼中斷周期中的先入先出接收隊列中的數(shù)據(jù)幀為全0,則記錄總線為空閑低電平狀態(tài),如果所述本次解碼中斷周期中的先入先出接收隊列中的數(shù)據(jù)幀為全1,則記錄總線為空閑高電平狀態(tài)。
[0015]可選地,在所述編碼為曼徹斯特碼的情況下,所述對所述數(shù)據(jù)幀進行解碼包括:
[0016]將所述接收隊列中的數(shù)據(jù)幀存儲到預(yù)設(shè)字節(jié)的存儲緩沖區(qū)中,其中,所述數(shù)據(jù)幀在所述存儲緩沖區(qū)中的存放順序與其在所述接收隊列中的存放順序相同;
[0017]依據(jù)所述存儲緩沖區(qū)中的字節(jié),依次檢測前導碼起始位、前導碼、幀前界定碼、數(shù)據(jù)碼及幀結(jié)束碼。
[0018]可選地,所述依據(jù)所述存儲緩沖區(qū)中的字節(jié),檢測所述前導碼起始位包括:
[0019]檢測所述存儲緩沖區(qū)中的數(shù)據(jù)幀是否存在由高到低的跳變;
[0020]若檢測到由高到低的跳變,且所述總線為空閑高電平狀態(tài),則確定從所述緩沖存儲區(qū)中的數(shù)據(jù)幀中檢測到編碼的前導碼起始位;
[0021]若檢測到由高到低的跳變,且所述總線為空閑低電平狀態(tài),則判斷所述由高到低的跳變之前的高電平被采樣的次數(shù)是否達到第二數(shù)值,如果是,則確定從所述緩沖存儲區(qū)中的數(shù)據(jù)幀中檢測到前導碼起始位。
[0022]可選地,所述存儲緩沖區(qū)為8個字節(jié);
[0023]所述檢測所述存儲緩沖區(qū)中的數(shù)據(jù)幀是否存在由高到低的跳變至少包括以下一項:
[0024]取上一中斷周期中存放在存儲緩沖區(qū)中的最后一個字節(jié)的后4位作為高4位,取本次中斷周期中存放在存儲緩沖區(qū)中的第一個字節(jié)的前4位作為低4位,組成新字節(jié),如果在所述新字節(jié)中出現(xiàn)以下任意一個預(yù)設(shè)數(shù)值,則確定存在由高到低的跳變,所述預(yù)設(shè)數(shù)值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE ;
[0025]判斷本次中斷周期、所述存儲緩沖區(qū)中的第一個字節(jié),如果出現(xiàn)所述預(yù)設(shè)數(shù)值中的任意一個,則確定存在由高到低的跳變;
[0026]遍歷所述存儲緩沖區(qū)中的所有字節(jié):取本次中斷周期、存儲緩沖區(qū)中的本次遍歷字節(jié)的后4位作為高4位,本次遍歷字節(jié)的后一個相鄰字節(jié)的前4位作為低4位,組成新字節(jié),如果所述新字節(jié)中出現(xiàn)所述預(yù)設(shè)數(shù)值中的任意一個,則確定存在由高到低的跳變;
[0027]判斷本次中斷周期、存儲緩沖區(qū)中的第二個字節(jié),如果為所述預(yù)設(shè)數(shù)值中的任意一個,則確定存在由高到低的跳變。
[0028]可選地,所述依據(jù)所述存儲緩沖區(qū)中的字節(jié),檢測所述前導碼包括:
[0029]設(shè)置16位的全局變量A,所述A的最高位為I ;
[0030]確定所述前導碼起始位在采樣得到的數(shù)據(jù)序列中的位置a ;
[0031 ] 按照以下方式分別確定A的剩余位數(shù)的值:
[0032]A:在本次中斷周期以及其之后的中斷周期、存儲緩沖區(qū)中的后續(xù)字節(jié)中查找由低到尚的跳變;
[0033]B:記錄所述低到高的跳變在采樣得到的數(shù)據(jù)序列中的位置b ;
[0034]C:如果不小于a,將b減去a的差值作為低電平的采樣次數(shù),如果b小于a,則將b減去a的差值與64之和作為低電平的采樣次數(shù);
[0035]D:如果所述低電平的采樣次數(shù)在第三數(shù)值與第四數(shù)值之間,則確定所述A的次高位為O ;如果所述低電平的采樣次數(shù)在第五數(shù)值與第六數(shù)值之間,則確定所述A的次高位及所述次高位的前一位均為O ;如果所述低電平的采樣次數(shù)為其它數(shù)值,則確定解碼出錯;
[0036]循環(huán)執(zhí)行A至D,直至得到A中全部位置的數(shù)值;
[0037]如果所述A的值為1001100110011001,則確定檢測到前導碼,否則,則確定解碼出錯O
[0038]可選地,所述依據(jù)所述存儲緩沖區(qū)中的字節(jié),檢測所述幀前界定碼包括:
[0039]設(shè)置16位的全局變量A,所述A的最高位為I ;
[0040]確定所述前導碼起始位在采樣得到的數(shù)據(jù)序列中的位置a ;
[0041 ] 按照以下方式分別確定A的剩余位數(shù)的值:
[0042]A:在本次中斷周期以及其之后的中斷周期、存儲緩沖區(qū)中的后續(xù)字節(jié)中查找由低到高的跳變;
[0043]B:記錄所述低到高的跳變在采樣得到的數(shù)據(jù)序列中位置b ;
[0044]C:如果不小于a,將b減去a的差值作為低電平的采樣次數(shù),如果b小于a,則將b減去a的差值與64之和作為低電平的采樣次數(shù);
[0045]D:如果所述低電平的采樣次數(shù)在第三數(shù)值與第四數(shù)值之間,則確定所述A的次高位為0,如果所述低電平的采樣次數(shù)在第五數(shù)值與第六數(shù)值之間,則確定所述A的次高位及所述次高位的前一位均為O ;如果所述低電平的采樣次數(shù)為其它數(shù)值,則確定解碼出錯;
[0046]循環(huán)執(zhí)行A至D,直至得到A中全部位置的數(shù)值;
[0047]如果所述A的值為1011001001001101,則確定檢測到幀前定界碼,否則,則確定解碼出錯。
[0048]可選地,所述依據(jù)所述存儲緩沖區(qū)中的字節(jié),檢測所述數(shù)據(jù)碼包括:
[0049]設(shè)置16位的全局變量A,所述A的最高位為I ;
[0050]確定所述前導碼起始位在采樣得到的數(shù)據(jù)序列中的位置a ;
[0051 ] 按照以下方式分別確定A的剩余位數(shù)的值:
[0052]A:在本次中斷周期以及其之后的中斷周期、存儲緩沖區(qū)中的后續(xù)字節(jié)中查找由低到尚的跳變;
[0053]B:記錄所述低到高的跳變在采樣得到的數(shù)據(jù)序列中位置b ;
[0054]C:如果不小于a,將b減去a的差值作為低電平的采樣次數(shù),如果b小于a,則將b減去a的差值與64之和作為低電平的采樣次數(shù);
[0055]D:如果所述低電平的采樣次數(shù)在第三數(shù)值與第四數(shù)值之間,則確定所述A的次高位為0,如果所述低電平的采樣次數(shù)在第五數(shù)值與第六數(shù)值之間,則確定所述A的次高位及所述次高位的前一位均為O ;如果所述低電平的采樣次數(shù)為其它數(shù)值,則確定解碼出錯;
[0056]循環(huán)執(zhí)行A至D,直至得到A中全部位置的數(shù)值;
[0057]依據(jù)預(yù)設(shè)的規(guī)則,將A轉(zhuǎn)換為數(shù)據(jù)碼B,預(yù)設(shè)的規(guī)則可以為將A從高位到低位兩兩分成一組,每組對應(yīng)數(shù)據(jù)碼B中的一位,對于任意一組,第一類型組合對應(yīng)第一碼值,第二類型組合對應(yīng)第二碼值。
[0058]可選地,所述依據(jù)所述存儲緩沖區(qū)中的字節(jié),檢測所述幀結(jié)束碼包括:
[0059]設(shè)置16位的全局變量A,所述A的最高位為I ;
[0060]確定所述前導碼起始位在采樣得到的數(shù)據(jù)序列中的位置a ;
[0061 ] 按照以下方式分別確定A的剩余位數(shù)的值:
[0062]A:在本次中斷周期以及其之后的中斷周期、存儲緩沖區(qū)中的后續(xù)字節(jié)中查找由低到尚的跳變;
[0063]B:記錄所述低到高的跳變在采樣得到的數(shù)據(jù)序列中位置b ;
[0064]C:如果不小于a,將b減去a的差值作為低電平的采樣次數(shù),如果b小于a,則將b減去a的差值與64之和作為低電平的采樣次數(shù);
[0065]D:如果所述低電平的采樣次數(shù)在第三數(shù)值與第四數(shù)值之間,則確定所述A的次高位為0,如果所述低電平的采樣次數(shù)在第五數(shù)值與第六數(shù)值之間,則確定所述A的次高位及所述次高位的前一位均為O ;如果所述低電平的采樣次數(shù)為其它數(shù)值,則確定解碼出錯;
[0066]循環(huán)執(zhí)行A至D,直至得到A中全部位置的數(shù)值;
[0067]如果所述A的值為1011001100100110,則確定檢測到幀結(jié)束碼,否則,則確定解碼出錯。
[0068]一種解碼裝置,包括:
[0069]采樣模塊,用于對接收到的編碼進行采樣;
[0070]存儲模塊,用于將采樣得到的數(shù)據(jù)序列存儲到接收隊列;
[0071]中斷模塊,用于在所述接收隊列中的數(shù)據(jù)序列的幀數(shù)達到第一數(shù)值后,產(chǎn)生解碼中斷;
[0072]解碼模塊,用于在本次中斷周期,對所述接收隊列中的數(shù)據(jù)幀進行解碼。
[0073]可選地,所述解碼模塊用于對所述接收隊列中的數(shù)據(jù)幀進行解碼包括:
[0074]所述解碼模塊具體用于,判斷所述接收隊列中的數(shù)據(jù)幀是否為全O或全1,如果否,則對所述數(shù)據(jù)幀進行解碼,如果所述本次解碼中斷周期中的先入先出接收隊列中的數(shù)據(jù)幀為全0,則記錄總線為空閑低電平狀態(tài),如果所述本次解碼中斷周期中的先入先出接收隊列中的數(shù)據(jù)幀為全1,則記錄總線為空閑高電平狀態(tài)。
[0075]可選地,所述解碼模塊用于對所述數(shù)據(jù)幀進行解碼包括:
[0076]所述解碼模塊具體用于,在所述編碼為曼徹斯特碼的情況下,將所述接收隊列中的數(shù)據(jù)幀存儲到預(yù)設(shè)字節(jié)的存儲緩沖區(qū)中,其中,所述數(shù)據(jù)幀在所述存儲緩沖區(qū)中的存放順序與其在所述接收隊列中的存放順序相同;依據(jù)所述存儲緩沖區(qū)中的字節(jié),依次檢測前導碼起始位、前導碼、幀前界定碼、數(shù)據(jù)碼及幀結(jié)束碼。
[0077]可選地,所述解碼模塊用于依據(jù)所述存儲緩沖區(qū)中的字節(jié),檢測所述前導碼起始位包括:
[0078]所述解碼模塊具體用于,檢測所述存儲緩沖區(qū)中的數(shù)據(jù)幀是否存在由高到低的跳變;若檢測到由高到低的跳變,且所述總線為空閑高電平狀態(tài),則確定從所述緩沖存儲區(qū)中的數(shù)據(jù)幀中檢測到編碼的前導碼起始位;若檢測到由高到低的跳變,且所述總線為空閑低電平狀態(tài),則判斷所述由高到低的跳變之前的高電平被采樣的次數(shù)是否達到第二數(shù)值,如果是,則確定從所述緩沖存儲區(qū)中的數(shù)據(jù)幀中檢測到前導碼起始位。
[0079]可選地,所述解碼模塊用于檢測所述存儲緩沖區(qū)中的數(shù)據(jù)幀是否存在由高到低的跳變包括:
[0080]所述解碼模塊具體用于,采用以下至少一項檢測所述存儲緩沖區(qū)中的數(shù)據(jù)幀是否存在由高到低的跳變:
[0081]取上一中斷周期中存放在存儲緩沖區(qū)中的最后一個字節(jié)的后4位作為高4位,取本次中斷周期中存放在存儲緩沖區(qū)中的第一個字節(jié)的前4位作為低4位,組成新字節(jié),如果在所述新字節(jié)中出現(xiàn)以下任意一個預(yù)設(shè)數(shù)值,則確定存在由高到低的跳變,所述預(yù)設(shè)數(shù)值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE,所述存儲緩沖區(qū)為8個字節(jié);
[0082]判斷本次中斷周期、所述存儲緩沖區(qū)中的