一种解码方法及装置的制造方法_3

文档序号:8545981阅读:来源:国知局
、存储缓冲区中的第一个字节,如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变。
[0155]3、如果还是没有查找到所述预设数值,遍历所述存储缓冲区中的所有字节:取本次中断周期、存储缓冲区中的本次遍历字节(例如第一字节)的后4位作为高4位,本次遍历字节的后一个相邻字节(例如第二字节)的前4位作为低4位,组成新字节。如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变。
[0156]4、如果没有查找到所述预设数值,则直接判断本次中断周期、存储缓冲区中的第二个字节,如果为所述预设数值中的任意一个,则确定存在由高到低的跳变。
[0157]5、如果没有查找到所述预设数值,则换下一个字节(例如第二字节),采样步骤3和4,直到查找到高到低的跳变。
[0158]比如,对于S302中所述的本次中断周期、存储缓冲区中的数据帧:假设总线空闲电平为高电平,上一次中断周期、存储缓冲区中的最后一个字节为OxFF,本次接收的第一个字节为0x00,取上一中断周期、存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期、存储缓冲区中的第一个字节的前4位作为低4位,组成的新字节为0处0,符合所述预设数值中的一个,则确定存在由高到低的跳变。
[0159]S3032:若检测到由高到低的跳变,且所述总线为空闲高电平状态,则确定从所述缓冲存储区中的数据帧中检测到编码的前导码起始位,否则确定解码出错;
[0160]S3033:若检测到由高到低的跳变,且所述总线为空闲低电平状态,则判断所述由高到低的跳变之前的高电平被采样的次数是否达到第二数值,如果是,则确定从所述缓冲存储区中的数据帧中检测到前导码起始位,否则,则确定解码错误。
[0161]这里第二数值可以为7。
[0162]例如,假设总线空闲电平为低,本次中断周期、存储缓冲区中的8个字节数据帧依次为:0x00,0x00,0x00,0x00,0x00,OxFF,0x00,0x00。在第 6 个字节(即 OxFF)和第 7 个字节(即0x00)中间存在由高到低的跳变,将第6个字节和0x7F相与,如结果等于0x7F说明高电平被采样的次数达到第二数值或大于第二数值,则可以确定从所述缓冲存储区中的数据帧中检测到前导码起始位。
[0163]在解码出错的情况下,结束本次中断,在检测到前导码起始位的情况下,执行S3035,即开始检测前导码:
[0164]S3035:设置16位的全局变量A,所述A的最高位为I ;
[0165]S3036:确定前导码起始位在采样得到的数据序列中的位置a ;
[0166]例如,根据S3033所举例的8个字节的接收数据,前导码起始位(即第一个由高到低的跳变)的位置a处于第6个字节和第7个字节之间,a = 48。
[0167]S3037:按照以下方式分别确定A的剩余位数的值:
[0168]A:在本次中断周期、存储缓冲区中的后续字节中查找由低到高的跳变,如果本次中断周期中、存储缓冲区中没有由低到高的跳变,则从下一中断周期的存储缓存区中的数据帧中找,依次类推;
[0169]B:记录所述低到高的跳变在采样得到的数据序列中的位置b ;
[0170]C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
[0171]D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的后一位均为O ;如果所述低电平的采样次数为其它数值,则确定解码出错;
[0172]本实施例中,因为每个字节为8位,严格来说,确定次高位为O的条件可以为低电平的采样次数为8,确定次高位及其后一位为O的条件可以为低电平的采样次数为16,而为了本实施例所述的方法可以具有更好的容错性,本实施例中,第一数值可以为第三数值可以为7,第四数值可以为9,第五数值可以为14,第六数值可以为18,即不严格限定在8和16,而是划定一个范围。
[0173]例如,根据S3033所举例的8个字节的接收数据,可以确定前导码的位置a = 48,但是遍历后续字节,无法找到低到高的跳变。
[0174]因此需要遍历下次接收到的8个字节数据,比如,下次接收到的8个字节数据为OxFF,OxFF,0x00,0x00,OxFF,OxFF,0x00,0x00,那么可以确定低到高的跳变发生在所述的本次接收的最后一位和所述下次接收的第I位之间,位置b为0,由于b〈a,所以b和a之间的差值计算公式为b+64-a,计算得差值为16,则确定所述A的次高位和所述次高位的后一位均为O。
[0175]循环执行A至D,直到解出A的全部位置上的数值。
[0176]S3038:如果所述A的值为1001100110011001,则确定检测到前导码,否则,则确定解码出错。
[0177]当检测出16个半位,即可得到A的值,将A的值和前导码值进行比较,即可得出正确解析到前导码。数据位为1,代表曼彻斯特码存在高到低的跳变,即A值中的10 ;数据位为0,代表曼彻斯特码存在低到高的跳变,即A值中的01 个数据位对应A中的两个位,也就是A中的一位,实际对应半个数据位。本实施例中,依据曼彻斯特码的规律,设置前导码的值为 1001100110011001ο
[0178]正确解码出前导码之后,进行检测帧前定界码:
[0179]S3039:设置16位的全局变量Α,所述A的最高位为I ;
[0180]确定所述前导码起始位在采样得到的数据序列中的位置a ;
[0181]按照以下方式分别确定A的剩余位数的值:
[0182]A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到尚的跳变;
[0183]B:记录所述低到高的跳变在采样得到的数据序列中位置b ;
[0184]C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
[0185]D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为O ;如果所述低电平的采样次数为其它数值,则确定解码出错;
[0186]循环执行A至D,直至得到A中全部位置的数值;
[0187]如果所述A的值为1011001001001101,则确定检测到帧前定界码,否则,则确定解码出错。
[0188]本实施例中,帧前定界码的值按半位表示为1011001001001101,跟检测前导码类似,每检测出半位,存储在A中,当检测出16个半位,即可得到A的值,将A的值和帧前定界码值进行比较,如果相同,则确定正确检测到帧前定界码,进行检测数据码的过程,即S3040,否则,则确定解码出错。
[0189]S3040:本实施例中,数据码按照字节存放,因此,和所述前导码和帧前定界码的解码方式类似,每检测出半位,存储到A中,当检测出16个半位,即可得到A的值,对A的值进行进一步解码,解码出8位的数据码B,存放到数据解码缓冲区中。
[0190]依据预设的规则,将A转换为数据码B,预设的规则可以为将A从高位到低位两两分成一组,每组对应数据码B中的一位,对于任意一组,第一类型组合对应第一码值,第二类型组合对应第二码值。
[0191]比如,A的具体值为1010010110010110,对A值的进一步解码过程具体如下:
[0192]1、判断A的Bitl5和Bitl4(即最高位和次高位)为10,解码出数据码B的最高位Bit7 为 I ;
[0193]2、A的Bitl3和Bitl2为10,解码出数据码B的Bit6为I ;
[0194]3、A的Bitll和BitlO为01,解码出数据码B的Bit5为O ;
[0195]4、A的Bit9和Bit8为01,解码出数据码B的Bit4为O ;
[0196]5、A的Bit7和Bit6为10,解码出数据码B的Bit3为I ;
[0197]6、A的Bit5和Bit4为01,解码出数据码B的Bit2为O ;
[0198]7、A的Bit3和Bit2为01,解码出数据码B的Bitl为O ;
[0199]8、A的Bitl和BitO为10,解码出数据码B的BitO为I。
[0200]由此可以解码出数据码B的值为0xC9。
[0201]S3041:依据所述存储缓冲区中的字节,检测所述帧结束码。
[0202]本实施例中,帧结束码的值按半位表示固定为1011001100100110,跟检测前导码类似,每检测出半位,存储在A中,当检测出16个半位,即可得到A的值,将A的值和帧结束码值进行比较,如果相同,则确定正确解析到帧结束码,否则,则确定解码错误。
[0203]本实施中所述的方法,按照字节查找跳变,以进行解码,与现有的解码方式相比,具有更尚的效率。
[0204]与上述方法实施例相对应地,本申请实施例还公开了一种解码装置,如图3所示,包括:
[0205]采样模块301,用于对接收到的编码进行采样;
[0206]存储模块302,用于将采样得到的数据序列存储到接收队列;
[0207]中断模块303,用于在所述接收队列中的数据序列的帧数达到第一数值后,产生解码中断;
[0208]解码模块304,用于在本次中断周期,对所述接收队列中的数据帧进行解码。
[0209]本实施例中,具体地,解码模块对所述接收队列中的数据帧进行解码的具体实现方式为:判断所述接收队列中的数据帧是否为全O或全1,如果否,则对所述数据帧进行解码,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全0,则记录总线为空闲低电平状态,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全1,则记录总线为空闲高电平状态。
[0210]进一步地,具体地,解码模块对所述数据帧进行解码的具体实现方式为:在所述编码为曼彻斯特码的情况下,将所述接收队列中的数据帧存储到预设字节的存储缓冲区中,其中,所述数据帧在所述存储缓冲区中的存放顺序与其在所述接收队列中的存放顺序相同;依据所述存储缓冲区中的字节,依次检测前导码起始位、前导码、帧前界定码、数据码及帧结束码。
[0211 ] 再进一步地,解码模块依据所述存储缓冲区中的字节,检测所述前导码起始位的具体实现方式可以为:检测所述存储缓冲区中的数据帧是否存在由高到低的跳变;若检测到由高到低的跳变,且所述总线为空闲高电平状态,则确定从所述缓冲存储区中的数据帧中检测到编码的前导码起始位;若检测到由高到低的跳变,且所述总线为空闲低电平状态,则判断所述由高到低的跳变之前的高电平被采样的次数是否达到第二数值,如果是,则确定从所述缓冲存储区中的数据帧中检测到前导码起始位。
[0212]解码模块检测所述存储缓冲区中的数据帧是否存在由高到低的跳变的具体实现方式可以为:采用以下至少一项检测所述存储缓冲区中的数据帧是否存在由高到低的跳变:
[0213]取上一中断周期中存放在存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期中存放在存储缓冲区中的第一个字节的前4位作为低4位,组成新字节,如果在所述新字节中出现以下任意一个预设数值,则确定存在由高到低的跳变,所述预设数值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE,所述存储缓冲区为8个字节;
[0214]判断本次中断周期、所述存储缓冲区中的第一个字节,如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
[0215]遍历所述存储缓冲区中的所有字节:取本次
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1