CN104868921A - 一种解码方法及装置 - Google Patents
一种解码方法及装置 Download PDFInfo
- Publication number
- CN104868921A CN104868921A CN201510276129.XA CN201510276129A CN104868921A CN 104868921 A CN104868921 A CN 104868921A CN 201510276129 A CN201510276129 A CN 201510276129A CN 104868921 A CN104868921 A CN 104868921A
- Authority
- CN
- China
- Prior art keywords
- low
- frame
- memory buffer
- value
- low level
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本申请提供了一种解码方法及装置,以接收队列中的帧数的数量为产生中断的触发条件,而非现有技术中的以电平的变化触发解码中断的产生,所以,能够避免频繁出现解码中断的现象,从而缓解处理器的计算压力,因此,能够实现使用主频较低的处理器进行解码的目的。
Description
技术领域
本申请涉及电子信息领域,尤其涉及一种解码方法及装置。
背景技术
相比于使用解码电路进行解码的方式而言,使用处理器解码的方式更为满足低功耗的要求。
现有的使用处理器进行解码的方式,在检测到电平的变化时,产生中断,进行解码。
而对于工业总线型的应用场景而言,在此情况下,处理器不可能支持处理频繁的中断解码。例如,曼彻斯特码在总线供电的应用中经常采用,如符合IEC61158-2标准的PROFIBUS-PA和FF-H1现场智能设备。总线供电对处理器的功耗有较高要求,一般处理器的主频不超过20MHz。曼彻斯特码的频率一般固定为31.25kHz,可见,现有的处理器解码方式并不适用于主频较低的处理器,因此,如何使用主频较低的处理器进行解码成为目前亟待解决的问题。
申请内容
本申请提供了一种解码方法及装置,目的在于解决如何使用主频较低的处理器进行解码的问题。
为了实现上述目的,本申请提供了以下技术方案:
一种解码方法,包括:
对接收到的编码进行采样;
将采样得到的数据序列存储到接收队列;
在所述接收队列中的数据序列的帧数达到第一数值后,产生解码中断;
在本次中断周期,对所述接收队列中的数据帧进行解码。
可选地,所述对所述接收队列中的数据帧进行解码包括:
判断所述接收队列中的数据帧是否为全0或全1,如果否,则对所述数据帧进行解码,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全0,则记录总线为空闲低电平状态,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全1,则记录总线为空闲高电平状态。
可选地,在所述编码为曼彻斯特码的情况下,所述对所述数据帧进行解码包括:
将所述接收队列中的数据帧存储到预设字节的存储缓冲区中,其中,所述数据帧在所述存储缓冲区中的存放顺序与其在所述接收队列中的存放顺序相同;
依据所述存储缓冲区中的字节,依次检测前导码起始位、前导码、帧前界定码、数据码及帧结束码。
可选地,所述依据所述存储缓冲区中的字节,检测所述前导码起始位包括:
检测所述存储缓冲区中的数据帧是否存在由高到低的跳变;
若检测到由高到低的跳变,且所述总线为空闲高电平状态,则确定从所述缓冲存储区中的数据帧中检测到编码的前导码起始位;
若检测到由高到低的跳变,且所述总线为空闲低电平状态,则判断所述由高到低的跳变之前的高电平被采样的次数是否达到第二数值,如果是,则确定从所述缓冲存储区中的数据帧中检测到前导码起始位。
可选地,所述存储缓冲区为8个字节;
所述检测所述存储缓冲区中的数据帧是否存在由高到低的跳变至少包括以下一项:
取上一中断周期中存放在存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期中存放在存储缓冲区中的第一个字节的前4位作为低4位,组成新字节,如果在所述新字节中出现以下任意一个预设数值,则确定存在由高到低的跳变,所述预设数值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE;
判断本次中断周期、所述存储缓冲区中的第一个字节,如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
遍历所述存储缓冲区中的所有字节:取本次中断周期、存储缓冲区中的本次遍历字节的后4位作为高4位,本次遍历字节的后一个相邻字节的前4位作为低4位,组成新字节,如果所述新字节中出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
判断本次中断周期、存储缓冲区中的第二个字节,如果为所述预设数值中的任意一个,则确定存在由高到低的跳变。
可选地,所述依据所述存储缓冲区中的字节,检测所述前导码包括:
设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中的位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0;如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1001100110011001,则确定检测到前导码,否则,则确定解码出错。
可选地,所述依据所述存储缓冲区中的字节,检测所述帧前界定码包括:
设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001001001101,则确定检测到帧前定界码,否则,则确定解码出错。
可选地,所述依据所述存储缓冲区中的字节,检测所述数据码包括:
设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
依据预设的规则,将A转换为数据码B,预设的规则可以为将A从高位到低位两两分成一组,每组对应数据码B中的一位,对于任意一组,第一类型组合对应第一码值,第二类型组合对应第二码值。
可选地,所述依据所述存储缓冲区中的字节,检测所述帧结束码包括:
设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001100100110,则确定检测到帧结束码,否则,则确定解码出错。
一种解码装置,包括:
采样模块,用于对接收到的编码进行采样;
存储模块,用于将采样得到的数据序列存储到接收队列;
中断模块,用于在所述接收队列中的数据序列的帧数达到第一数值后,产生解码中断;
解码模块,用于在本次中断周期,对所述接收队列中的数据帧进行解码。
可选地,所述解码模块用于对所述接收队列中的数据帧进行解码包括:
所述解码模块具体用于,判断所述接收队列中的数据帧是否为全0或全1,如果否,则对所述数据帧进行解码,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全0,则记录总线为空闲低电平状态,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全1,则记录总线为空闲高电平状态。
可选地,所述解码模块用于对所述数据帧进行解码包括:
所述解码模块具体用于,在所述编码为曼彻斯特码的情况下,将所述接收队列中的数据帧存储到预设字节的存储缓冲区中,其中,所述数据帧在所述存储缓冲区中的存放顺序与其在所述接收队列中的存放顺序相同;依据所述存储缓冲区中的字节,依次检测前导码起始位、前导码、帧前界定码、数据码及帧结束码。
可选地,所述解码模块用于依据所述存储缓冲区中的字节,检测所述前导码起始位包括:
所述解码模块具体用于,检测所述存储缓冲区中的数据帧是否存在由高到低的跳变;若检测到由高到低的跳变,且所述总线为空闲高电平状态,则确定从所述缓冲存储区中的数据帧中检测到编码的前导码起始位;若检测到由高到低的跳变,且所述总线为空闲低电平状态,则判断所述由高到低的跳变之前的高电平被采样的次数是否达到第二数值,如果是,则确定从所述缓冲存储区中的数据帧中检测到前导码起始位。
可选地,所述解码模块用于检测所述存储缓冲区中的数据帧是否存在由高到低的跳变包括:
所述解码模块具体用于,采用以下至少一项检测所述存储缓冲区中的数据帧是否存在由高到低的跳变:
取上一中断周期中存放在存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期中存放在存储缓冲区中的第一个字节的前4位作为低4位,组成新字节,如果在所述新字节中出现以下任意一个预设数值,则确定存在由高到低的跳变,所述预设数值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE,所述存储缓冲区为8个字节;
判断本次中断周期、所述存储缓冲区中的第一个字节,如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
遍历所述存储缓冲区中的所有字节:取本次中断周期、存储缓冲区中的本次遍历字节的后4位作为高4位,本次遍历字节的后一个相邻字节的前4位作为低4位,组成新字节,如果所述新字节中出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
判断本次中断周期、存储缓冲区中的第二个字节,如果为所述预设数值中的任意一个,则确定存在由高到低的跳变。
可选地,所述解码模块用于依据所述存储缓冲区中的字节,检测所述前导码包括:
所述解码模块具体用于,设置16位的全局变量A,所述A的最高位为1;确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中的位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0;如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1001100110011001,则确定检测到前导码,否则,则确定解码出错。
可选地,所述解码模块用于依据所述存储缓冲区中的字节,检测所述帧前界定码包括:
所述解码模块具体用于,设置16位的全局变量A,所述A的最高位为1;确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001001001101,则确定检测到帧前定界码,否则,则确定解码出错。
可选地,所述解码模块用于依据所述存储缓冲区中的字节,检测所述数据码包括:
所述解码模块具体用于,设置16位的全局变量A,所述A的最高位为1;确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
依据预设的规则,将A转换为数据码B,预设的规则可以为将A从高位到低位两两分成一组,每组对应数据码B中的一位,对于任意一组,第一类型组合对应第一码值,第二类型组合对应第二码值。
可选地,所述解码模块用于依据所述存储缓冲区中的字节,检测所述帧结束码包括:
所述解码模块具体用于,设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001100100110,则确定检测到帧结束码,否则,则确定解码出错。
本申请所述的解码方法及装置,以接收队列中的帧数的数量为产生中断的触发条件,而非现有技术中的以电平的变化触发解码中断的产生,所以,能够避免频繁出现解码中断的现象,从而缓解处理器的计算压力,因此,能够实现使用主频较低的处理器进行解码的目的。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例公开的一种解码方法的流程图;
图2为本申请实施例公开的又一种解码方法的流程图;
图3为本申请实施例公开的一种解码装置的结构示意图;
图4为本申请实施例公开的解码装置在实际应用中的硬件连接示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例公开了一种解码方法,如图1所示,包括:
S101:对接收到的编码进行采样;
S102:将采样得到的数据序列存储到接收队列;
S103:在所述接收队列中的数据序列的帧数达到第一数值后,产生中断;
S104:在本次中断周期,对所述接收队列中的数据帧进行解码。
本实施例中所述的方法,以接收队列中的帧数的数量为产生中断的触发条件,而非现有技术中的以电平的变化触发解码中断的产生,所以,能够避免频繁出现解码中断的现象,从而缓解处理器的计算压力,因此,能够适用于工业现场总线的场景。
本申请实施例公开的又一种解码方法,在本实施例中,以曼彻斯特码为例进行说明,本实施例所述的方法可以应用在微控制单元(MicroControllerUnit,MCU)中,如图2所示,所述方法包括以下步骤:
S201:对接收到的编码进行采样;
本实施例中,以500Hz频率进行采样。
S202:将采样得到的数据序列存储到MCU采样接口中的先入先出接收队列;
例如,MCU采样接口中的先入先出接收队列的长度为8,即最多可接收8帧数据序列,每帧设置为16位(两个字节)。曼彻斯特码的频率为31.25kHz,因此,每个曼彻斯特位会被采样到16次。比如以曼彻斯特码传输字节0x9C(二进制表示为10011100),采样到的数据序列16进制表示为0xFF0000FF00FFFF00FF00FF0000FF00FF,其在先入先出队列中的存放方式为第一帧0xFF00,第二帧0x00FF,第三帧0x00FF,第四帧0xFF00,第五帧0xFF00,第六帧0x00FF,第七帧0x00FF,第八帧0x00FF。
S203:在所述先入先出接收队列中的数据序列的帧数达到第一数值后,产生解码中断;
本实施例中,第一数值可以为4。
例如,如上所述的先入先出接收队列中可以存放8帧数据,实际应用过程中,不可能等MCU接口接收到8帧数据满之后再响应中断,这样可能会导致队列满溢出而丢失接收数据。
S204:对所述接收队列中的数据帧进行解码。
本实施例中,具体的解码过程包括:
S301:判断所述本次解码中断周期中的先入先出接收队列中的数据帧是否为全0或全1,如果否,则执行S302,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全0,则记录总线为空闲低电平状态,如果所述存储缓冲区中的数据帧为全1,则记录总线为空闲高电平状态;
S302:将所述本次解码周期中的先入先出接收队列中的数据帧存储到预设字节的存储缓冲区中,其中,数据帧在存储缓冲区中的存放顺序与其在先入先出接收队列中的存放顺序相同;
本实施例中,存储缓冲区的长度可以为待存放的数据帧的两倍。
例如:先入先出接收队列的数据帧为4帧,每帧16位,所以预设字节存储缓冲区长度为帧数的2倍,即每帧的长度为8,如前所述,先入先出接收队列的前4帧数据分别为第一帧0xFF00、第二帧0x00FF、第三帧0x00FF、第四帧0xFF00,在先入先出接收队列中满4帧后,将其存储到存储缓冲区中,存储到预设字节的存储缓冲区中的从第一字节到第八字节顺序0xFF、0x00、0x00、0xFF、0x00、0xFF、0xFF、0x00。
S303:依据所述存储缓冲区中的字节,依次检测前导码起始位、前导码、帧前界定码、数据码及帧结束码。
下面分别具体说明检测前导码起始位、前导码、帧前界定码、数据码及帧结束码的具体实现过程:
首先检测前导码起始位:
S3031:查找存储缓冲区中的数据帧是否存在由高到低的跳变;
前导码起始位即总线电平空闲状态下所出现的第一个高到低的跳变。
本实施例中,由高到低的跳变的检测方法为:
按照以下5步检测由高到低的跳变,需要说明的是,以下5个步骤,只要能找到由高到低的跳变即可停止,而无需全部执行。这里继续前述的例子,存储缓冲区中一共8个字节,每个字节的长度为8:
1、取上一中断周期中存放在存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期中存放在存储缓冲区中的第一个字节的前4位作为低4位,组成新字节,在出现以下任意一个预设数值的情况下,则确定存在由高到低的跳变,所述预设数值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE;
2、如果没有查找到所述预设数值,则直接判断本次中断周期、存储缓冲区中的第一个字节,如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变。
3、如果还是没有查找到所述预设数值,遍历所述存储缓冲区中的所有字节:取本次中断周期、存储缓冲区中的本次遍历字节(例如第一字节)的后4位作为高4位,本次遍历字节的后一个相邻字节(例如第二字节)的前4位作为低4位,组成新字节。如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变。
4、如果没有查找到所述预设数值,则直接判断本次中断周期、存储缓冲区中的第二个字节,如果为所述预设数值中的任意一个,则确定存在由高到低的跳变。
5、如果没有查找到所述预设数值,则换下一个字节(例如第二字节),采样步骤3和4,直到查找到高到低的跳变。
比如,对于S302中所述的本次中断周期、存储缓冲区中的数据帧:假设总线空闲电平为高电平,上一次中断周期、存储缓冲区中的最后一个字节为0xFF,本次接收的第一个字节为0x00,取上一中断周期、存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期、存储缓冲区中的第一个字节的前4位作为低4位,组成的新字节为0xF0,符合所述预设数值中的一个,则确定存在由高到低的跳变。
S3032:若检测到由高到低的跳变,且所述总线为空闲高电平状态,则确定从所述缓冲存储区中的数据帧中检测到编码的前导码起始位,否则确定解码出错;
S3033:若检测到由高到低的跳变,且所述总线为空闲低电平状态,则判断所述由高到低的跳变之前的高电平被采样的次数是否达到第二数值,如果是,则确定从所述缓冲存储区中的数据帧中检测到前导码起始位,否则,则确定解码错误。
这里第二数值可以为7。
例如,假设总线空闲电平为低,本次中断周期、存储缓冲区中的8个字节数据帧依次为:0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00。在第6个字节(即0xFF)和第7个字节(即0x00)中间存在由高到低的跳变,将第6个字节和0x7F相与,如结果等于0x7F说明高电平被采样的次数达到第二数值或大于第二数值,则可以确定从所述缓冲存储区中的数据帧中检测到前导码起始位。
在解码出错的情况下,结束本次中断,在检测到前导码起始位的情况下,执行S3035,即开始检测前导码:
S3035:设置16位的全局变量A,所述A的最高位为1;
S3036:确定前导码起始位在采样得到的数据序列中的位置a;
例如,根据S3033所举例的8个字节的接收数据,前导码起始位(即第一个由高到低的跳变)的位置a处于第6个字节和第7个字节之间,a=48。
S3037:按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期、存储缓冲区中的后续字节中查找由低到高的跳变,如果本次中断周期中、存储缓冲区中没有由低到高的跳变,则从下一中断周期的存储缓存区中的数据帧中找,依次类推;
B:记录所述低到高的跳变在采样得到的数据序列中的位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的后一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
本实施例中,因为每个字节为8位,严格来说,确定次高位为0的条件可以为低电平的采样次数为8,确定次高位及其后一位为0的条件可以为低电平的采样次数为16,而为了本实施例所述的方法可以具有更好的容错性,本实施例中,第一数值可以为第三数值可以为7,第四数值可以为9,第五数值可以为14,第六数值可以为18,即不严格限定在8和16,而是划定一个范围。
例如,根据S3033所举例的8个字节的接收数据,可以确定前导码的位置a=48,但是遍历后续字节,无法找到低到高的跳变。
因此需要遍历下次接收到的8个字节数据,比如,下次接收到的8个字节数据为0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,那么可以确定低到高的跳变发生在所述的本次接收的最后一位和所述下次接收的第1位之间,位置b为0,由于b<a,所以b和a之间的差值计算公式为b+64-a,计算得差值为16,则确定所述A的次高位和所述次高位的后一位均为0。
循环执行A至D,直到解出A的全部位置上的数值。
S3038:如果所述A的值为1001100110011001,则确定检测到前导码,否则,则确定解码出错。
当检测出16个半位,即可得到A的值,将A的值和前导码值进行比较,即可得出正确解析到前导码。数据位为1,代表曼彻斯特码存在高到低的跳变,即A值中的10;数据位为0,代表曼彻斯特码存在低到高的跳变,即A值中的01;一个数据位对应A中的两个位,也就是A中的一位,实际对应半个数据位。本实施例中,依据曼彻斯特码的规律,设置前导码的值为1001100110011001。
正确解码出前导码之后,进行检测帧前定界码:
S3039:设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001001001101,则确定检测到帧前定界码,否则,则确定解码出错。
本实施例中,帧前定界码的值按半位表示为1011001001001101,跟检测前导码类似,每检测出半位,存储在A中,当检测出16个半位,即可得到A的值,将A的值和帧前定界码值进行比较,如果相同,则确定正确检测到帧前定界码,进行检测数据码的过程,即S3040,否则,则确定解码出错。
S3040:本实施例中,数据码按照字节存放,因此,和所述前导码和帧前定界码的解码方式类似,每检测出半位,存储到A中,当检测出16个半位,即可得到A的值,对A的值进行进一步解码,解码出8位的数据码B,存放到数据解码缓冲区中。
依据预设的规则,将A转换为数据码B,预设的规则可以为将A从高位到低位两两分成一组,每组对应数据码B中的一位,对于任意一组,第一类型组合对应第一码值,第二类型组合对应第二码值。
比如,A的具体值为1010010110010110,对A值的进一步解码过程具体如下:
1、判断A的Bit15和Bit14(即最高位和次高位)为10,解码出数据码B的最高位Bit7为1;
2、A的Bit13和Bit12为10,解码出数据码B的Bit6为1;
3、A的Bit11和Bit10为01,解码出数据码B的Bit5为0;
4、A的Bit9和Bit8为01,解码出数据码B的Bit4为0;
5、A的Bit7和Bit6为10,解码出数据码B的Bit3为1;
6、A的Bit5和Bit4为01,解码出数据码B的Bit2为0;
7、A的Bit3和Bit2为01,解码出数据码B的Bit1为0;
8、A的Bit1和Bit0为10,解码出数据码B的Bit0为1。
由此可以解码出数据码B的值为0xC9。
S3041:依据所述存储缓冲区中的字节,检测所述帧结束码。
本实施例中,帧结束码的值按半位表示固定为1011001100100110,跟检测前导码类似,每检测出半位,存储在A中,当检测出16个半位,即可得到A的值,将A的值和帧结束码值进行比较,如果相同,则确定正确解析到帧结束码,否则,则确定解码错误。
本实施中所述的方法,按照字节查找跳变,以进行解码,与现有的解码方式相比,具有更高的效率。
与上述方法实施例相对应地,本申请实施例还公开了一种解码装置,如图3所示,包括:
采样模块301,用于对接收到的编码进行采样;
存储模块302,用于将采样得到的数据序列存储到接收队列;
中断模块303,用于在所述接收队列中的数据序列的帧数达到第一数值后,产生解码中断;
解码模块304,用于在本次中断周期,对所述接收队列中的数据帧进行解码。
本实施例中,具体地,解码模块对所述接收队列中的数据帧进行解码的具体实现方式为:判断所述接收队列中的数据帧是否为全0或全1,如果否,则对所述数据帧进行解码,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全0,则记录总线为空闲低电平状态,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全1,则记录总线为空闲高电平状态。
进一步地,具体地,解码模块对所述数据帧进行解码的具体实现方式为:在所述编码为曼彻斯特码的情况下,将所述接收队列中的数据帧存储到预设字节的存储缓冲区中,其中,所述数据帧在所述存储缓冲区中的存放顺序与其在所述接收队列中的存放顺序相同;依据所述存储缓冲区中的字节,依次检测前导码起始位、前导码、帧前界定码、数据码及帧结束码。
再进一步地,解码模块依据所述存储缓冲区中的字节,检测所述前导码起始位的具体实现方式可以为:检测所述存储缓冲区中的数据帧是否存在由高到低的跳变;若检测到由高到低的跳变,且所述总线为空闲高电平状态,则确定从所述缓冲存储区中的数据帧中检测到编码的前导码起始位;若检测到由高到低的跳变,且所述总线为空闲低电平状态,则判断所述由高到低的跳变之前的高电平被采样的次数是否达到第二数值,如果是,则确定从所述缓冲存储区中的数据帧中检测到前导码起始位。
解码模块检测所述存储缓冲区中的数据帧是否存在由高到低的跳变的具体实现方式可以为:采用以下至少一项检测所述存储缓冲区中的数据帧是否存在由高到低的跳变:
取上一中断周期中存放在存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期中存放在存储缓冲区中的第一个字节的前4位作为低4位,组成新字节,如果在所述新字节中出现以下任意一个预设数值,则确定存在由高到低的跳变,所述预设数值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE,所述存储缓冲区为8个字节;
判断本次中断周期、所述存储缓冲区中的第一个字节,如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
遍历所述存储缓冲区中的所有字节:取本次中断周期、存储缓冲区中的本次遍历字节的后4位作为高4位,本次遍历字节的后一个相邻字节的前4位作为低4位,组成新字节,如果所述新字节中出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
判断本次中断周期、存储缓冲区中的第二个字节,如果为所述预设数值中的任意一个,则确定存在由高到低的跳变。
解码模块依据所述存储缓冲区中的字节,检测所述前导码的具体实现方式为:设置16位的全局变量A,所述A的最高位为1;确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中的位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0;如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1001100110011001,则确定检测到前导码,否则,则确定解码出错。
解码模块依据所述存储缓冲区中的字节,检测所述帧前界定码的具体实现方式为:设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001001001101,则确定检测到帧前定界码,否则,则确定解码出错。
解码模块依据所述存储缓冲区中的字节,检测所述数据码的具体实现方式可以为:设置16位的全局变量A,所述A的最高位为1;确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
依据预设的规则,将A转换为数据码B,预设的规则可以为将A从高位到低位两两分成一组,每组对应数据码B中的一位,对于任意一组,第一类型组合对应第一码值,第二类型组合对应第二码值。
解码模块依据所述存储缓冲区中的字节,检测所述帧结束码的具体实现方式可以为:设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001100100110,则确定检测到帧结束码,否则,则确定解码出错。
本实施例所述装置在实际应用中的硬件连接如图4所示,其中,本实施例所述装置可以为嵌入式微处理器,嵌入式微处理器的SSP接口设置为从机模式,将IEC61158-2驱动电路的PO引脚连接到嵌入式微处理器的SSP接口的MISO引脚,以便嵌入式微处理器将曼彻斯特编码通过IEC61158-2驱动电路输出到现场总线上。将IEC61158-2驱动电路的PI引脚连接到嵌入式微处理器的SSP接口的MOSI引脚,以便IEC61158-2驱动电路将曼彻斯特CMOS信号通过MOSI引脚进入嵌入式微处理器。SSP接口的SSEL引脚连接高电平,说明SSP接口始终处于工作状态。嵌入式微处理器产生一个时钟信号,通过PWM引脚连接SSP接口的SCK引脚,作为SSP接口的采样时钟信号。IEC61158-2驱动电路与嵌入式微处理器的GND引脚一起并接地。
使用图4所示硬件电路进行编码的步骤包括:
1)SSP接口设置在解码时已经完成设置,在发送前,完成整包发送报文的预编码。
i.数据位的值为1,编码后用十六进制表示为0xFF00;
ii.数据位的值为0,编码后用十六进制表示为0x00FF;
2)同时完成前导码、帧前定界码和帧结束码的编码。
3)整个编码存放在发送缓冲区中等待发送。
4)发送时刻到时,SSP接口使能发送,禁止接收,发送缓冲区数据通过SSP接口MISO引脚发送至IEC61158-2驱动电路。
5)发送连续性保证
i.SSP接口为8帧收发FIFO队列,开始发送时写入8帧队列数据发送;
每发送完4帧队列数据产生发送半空中断,中断处理程序中再写入4帧队列数据。
本申请实施例方法所述的功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算设备可读取存储介质中。基于这样的理解,本申请实施例对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该软件产品存储在一个存储介质中,包括若干指令用以使得一台计算设备(可以是个人计算机,服务器,移动计算设备或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (18)
1.一种解码方法,其特征在于,包括:
对接收到的编码进行采样;
将采样得到的数据序列存储到接收队列;
在所述接收队列中的数据序列的帧数达到第一数值后,产生解码中断;
在本次中断周期,对所述接收队列中的数据帧进行解码。
2.根据权利要求1所述的方法,其特征在于,所述对所述接收队列中的数据帧进行解码包括:
判断所述接收队列中的数据帧是否为全0或全1,如果否,则对所述数据帧进行解码,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全0,则记录总线为空闲低电平状态,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全1,则记录总线为空闲高电平状态。
3.根据权利要求2所述的方法,其特征在于,在所述编码为曼彻斯特码的情况下,所述对所述数据帧进行解码包括:
将所述接收队列中的数据帧存储到预设字节的存储缓冲区中,其中,所述数据帧在所述存储缓冲区中的存放顺序与其在所述接收队列中的存放顺序相同;
依据所述存储缓冲区中的字节,依次检测前导码起始位、前导码、帧前界定码、数据码及帧结束码。
4.根据权利要求3所述的方法,其特征在于,所述依据所述存储缓冲区中的字节,检测所述前导码起始位包括:
检测所述存储缓冲区中的数据帧是否存在由高到低的跳变;
若检测到由高到低的跳变,且所述总线为空闲高电平状态,则确定从所述缓冲存储区中的数据帧中检测到编码的前导码起始位;
若检测到由高到低的跳变,且所述总线为空闲低电平状态,则判断所述由高到低的跳变之前的高电平被采样的次数是否达到第二数值,如果是,则确定从所述缓冲存储区中的数据帧中检测到前导码起始位。
5.根据权利要求4所述的方法,其特征在于,所述存储缓冲区为8个字节;
所述检测所述存储缓冲区中的数据帧是否存在由高到低的跳变至少包括以下一项:
取上一中断周期中存放在存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期中存放在存储缓冲区中的第一个字节的前4位作为低4位,组成新字节,如果在所述新字节中出现以下任意一个预设数值,则确定存在由高到低的跳变,所述预设数值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE;
判断本次中断周期、所述存储缓冲区中的第一个字节,如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
遍历所述存储缓冲区中的所有字节:取本次中断周期、存储缓冲区中的本次遍历字节的后4位作为高4位,本次遍历字节的后一个相邻字节的前4位作为低4位,组成新字节,如果所述新字节中出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
判断本次中断周期、存储缓冲区中的第二个字节,如果为所述预设数值中的任意一个,则确定存在由高到低的跳变。
6.根据权利要求5所述的方法,其特征在于,所述依据所述存储缓冲区中的字节,检测所述前导码包括:
设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中的位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0;如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1001100110011001,则确定检测到前导码,否则,则确定解码出错。
7.根据权利要求6所述的方法,其特征在于,所述依据所述存储缓冲区中的字节,检测所述帧前界定码包括:
设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001001001101,则确定检测到帧前定界码,否则,则确定解码出错。
8.根据权利要求7所述的方法,其特征在于,所述依据所述存储缓冲区中的字节,检测所述数据码包括:
设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
依据预设的规则,将A转换为数据码B,预设的规则可以为将A从高位到低位两两分成一组,每组对应数据码B中的一位,对于任意一组,第一类型组合对应第一码值,第二类型组合对应第二码值。
9.根据权利要求8所述的方法,其特征在于,所述依据所述存储缓冲区中的字节,检测所述帧结束码包括:
设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001100100110,则确定检测到帧结束码,否则,则确定解码出错。
10.一种解码装置,其特征在于,包括:
采样模块,用于对接收到的编码进行采样;
存储模块,用于将采样得到的数据序列存储到接收队列;
中断模块,用于在所述接收队列中的数据序列的帧数达到第一数值后,产生解码中断;
解码模块,用于在本次中断周期,对所述接收队列中的数据帧进行解码。
11.根据权利要求10所述的装置,其特征在于,所述解码模块用于对所述接收队列中的数据帧进行解码包括:
所述解码模块具体用于,判断所述接收队列中的数据帧是否为全0或全1,如果否,则对所述数据帧进行解码,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全0,则记录总线为空闲低电平状态,如果所述本次解码中断周期中的先入先出接收队列中的数据帧为全1,则记录总线为空闲高电平状态。
12.根据权利要求11所述的装置,其特征在于,所述解码模块用于对所述数据帧进行解码包括:
所述解码模块具体用于,在所述编码为曼彻斯特码的情况下,将所述接收队列中的数据帧存储到预设字节的存储缓冲区中,其中,所述数据帧在所述存储缓冲区中的存放顺序与其在所述接收队列中的存放顺序相同;依据所述存储缓冲区中的字节,依次检测前导码起始位、前导码、帧前界定码、数据码及帧结束码。
13.根据权利要求12所述的装置,其特征在于,所述解码模块用于依据所述存储缓冲区中的字节,检测所述前导码起始位包括:
所述解码模块具体用于,检测所述存储缓冲区中的数据帧是否存在由高到低的跳变;若检测到由高到低的跳变,且所述总线为空闲高电平状态,则确定从所述缓冲存储区中的数据帧中检测到编码的前导码起始位;若检测到由高到低的跳变,且所述总线为空闲低电平状态,则判断所述由高到低的跳变之前的高电平被采样的次数是否达到第二数值,如果是,则确定从所述缓冲存储区中的数据帧中检测到前导码起始位。
14.根据权利要求13所述的装置,其特征在于,所述解码模块用于检测所述存储缓冲区中的数据帧是否存在由高到低的跳变包括:
所述解码模块具体用于,采用以下至少一项检测所述存储缓冲区中的数据帧是否存在由高到低的跳变:
取上一中断周期中存放在存储缓冲区中的最后一个字节的后4位作为高4位,取本次中断周期中存放在存储缓冲区中的第一个字节的前4位作为低4位,组成新字节,如果在所述新字节中出现以下任意一个预设数值,则确定存在由高到低的跳变,所述预设数值包括:0x80、0xC0、0xE0、0xF0、0xF8、0xFC、0xFE,所述存储缓冲区为8个字节;
判断本次中断周期、所述存储缓冲区中的第一个字节,如果出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
遍历所述存储缓冲区中的所有字节:取本次中断周期、存储缓冲区中的本次遍历字节的后4位作为高4位,本次遍历字节的后一个相邻字节的前4位作为低4位,组成新字节,如果所述新字节中出现所述预设数值中的任意一个,则确定存在由高到低的跳变;
判断本次中断周期、存储缓冲区中的第二个字节,如果为所述预设数值中的任意一个,则确定存在由高到低的跳变。
15.根据权利要求14所述的装置,其特征在于,所述解码模块用于依据所述存储缓冲区中的字节,检测所述前导码包括:
所述解码模块具体用于,设置16位的全局变量A,所述A的最高位为1;确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中的位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0;如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1001100110011001,则确定检测到前导码,否则,则确定解码出错。
16.根据权利要求15所述的装置,其特征在于,所述解码模块用于依据所述存储缓冲区中的字节,检测所述帧前界定码包括:
所述解码模块具体用于,设置16位的全局变量A,所述A的最高位为1;确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001001001101,则确定检测到帧前定界码,否则,则确定解码出错。
17.根据权利要求16所述的装置,其特征在于,所述解码模块用于依据所述存储缓冲区中的字节,检测所述数据码包括:
所述解码模块具体用于,设置16位的全局变量A,所述A的最高位为1;确定所述前导码起始位在采样得到的数据序列中的位置a;按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
依据预设的规则,将A转换为数据码B,预设的规则可以为将A从高位到低位两两分成一组,每组对应数据码B中的一位,对于任意一组,第一类型组合对应第一码值,第二类型组合对应第二码值。
18.根据权利要求16所述的装置,其特征在于,所述解码模块用于依据所述存储缓冲区中的字节,检测所述帧结束码包括:
所述解码模块具体用于,设置16位的全局变量A,所述A的最高位为1;
确定所述前导码起始位在采样得到的数据序列中的位置a;
按照以下方式分别确定A的剩余位数的值:
A:在本次中断周期以及其之后的中断周期、存储缓冲区中的后续字节中查找由低到高的跳变;
B:记录所述低到高的跳变在采样得到的数据序列中位置b;
C:如果不小于a,将b减去a的差值作为低电平的采样次数,如果b小于a,则将b减去a的差值与64之和作为低电平的采样次数;
D:如果所述低电平的采样次数在第三数值与第四数值之间,则确定所述A的次高位为0,如果所述低电平的采样次数在第五数值与第六数值之间,则确定所述A的次高位及所述次高位的前一位均为0;如果所述低电平的采样次数为其它数值,则确定解码出错;
循环执行A至D,直至得到A中全部位置的数值;
如果所述A的值为1011001100100110,则确定检测到帧结束码,否则,则确定解码出错。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510276129.XA CN104868921B (zh) | 2015-05-26 | 2015-05-26 | 一种解码方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510276129.XA CN104868921B (zh) | 2015-05-26 | 2015-05-26 | 一种解码方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104868921A true CN104868921A (zh) | 2015-08-26 |
CN104868921B CN104868921B (zh) | 2018-05-18 |
Family
ID=53914479
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510276129.XA Active CN104868921B (zh) | 2015-05-26 | 2015-05-26 | 一种解码方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104868921B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106603088A (zh) * | 2016-12-22 | 2017-04-26 | 深圳市盈科互动科技有限公司 | 在mcu内进行无线射频解码的方法及装置 |
CN106672730A (zh) * | 2017-03-15 | 2017-05-17 | 日立电梯(中国)有限公司 | 电梯轿厢绝对位置检测系统及电梯系统 |
CN108734944A (zh) * | 2017-04-18 | 2018-11-02 | 陕西万方汽车零部件有限公司 | 一种无线遥控解码方法及其装置 |
CN109688080A (zh) * | 2017-10-18 | 2019-04-26 | 华大半导体有限公司 | Miller编码的解码方法以及RFID阅读器 |
CN110838204A (zh) * | 2019-11-05 | 2020-02-25 | 艾体威尔电子技术(北京)有限公司 | 一种磁条卡刷卡终端解码方法 |
CN112235218A (zh) * | 2020-12-15 | 2021-01-15 | 广州智慧城市发展研究院 | 曼彻斯特信号解码方法及装置 |
CN112491763A (zh) * | 2020-11-30 | 2021-03-12 | 杭州海康威视数字技术股份有限公司 | 一种针对曼彻斯特编码的解码方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080141309A1 (en) * | 2006-12-06 | 2008-06-12 | Eric Lawrence Barsness | Retrieving Lost Content for a Scheduled Program |
CN102025449A (zh) * | 2010-11-19 | 2011-04-20 | 中兴通讯股份有限公司 | 一种数据码块同步的方法及装置 |
CN103701569A (zh) * | 2013-12-31 | 2014-04-02 | 大唐移动通信设备有限公司 | Td-scdma中传输格式组合指示tfci译码的方法及装置 |
-
2015
- 2015-05-26 CN CN201510276129.XA patent/CN104868921B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080141309A1 (en) * | 2006-12-06 | 2008-06-12 | Eric Lawrence Barsness | Retrieving Lost Content for a Scheduled Program |
CN102025449A (zh) * | 2010-11-19 | 2011-04-20 | 中兴通讯股份有限公司 | 一种数据码块同步的方法及装置 |
CN103701569A (zh) * | 2013-12-31 | 2014-04-02 | 大唐移动通信设备有限公司 | Td-scdma中传输格式组合指示tfci译码的方法及装置 |
Non-Patent Citations (1)
Title |
---|
陈军伟 等: "符合IEC61158-2物理层的曼彻斯特软编解码技术", 《中国仪器仪表》 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106603088A (zh) * | 2016-12-22 | 2017-04-26 | 深圳市盈科互动科技有限公司 | 在mcu内进行无线射频解码的方法及装置 |
CN106672730A (zh) * | 2017-03-15 | 2017-05-17 | 日立电梯(中国)有限公司 | 电梯轿厢绝对位置检测系统及电梯系统 |
CN106672730B (zh) * | 2017-03-15 | 2019-08-30 | 日立电梯(中国)有限公司 | 电梯轿厢绝对位置检测系统及电梯系统 |
CN108734944A (zh) * | 2017-04-18 | 2018-11-02 | 陕西万方汽车零部件有限公司 | 一种无线遥控解码方法及其装置 |
CN109688080A (zh) * | 2017-10-18 | 2019-04-26 | 华大半导体有限公司 | Miller编码的解码方法以及RFID阅读器 |
CN109688080B (zh) * | 2017-10-18 | 2021-06-29 | 华大恒芯科技有限公司 | Miller编码的解码方法以及RFID阅读器 |
CN110838204A (zh) * | 2019-11-05 | 2020-02-25 | 艾体威尔电子技术(北京)有限公司 | 一种磁条卡刷卡终端解码方法 |
CN112491763A (zh) * | 2020-11-30 | 2021-03-12 | 杭州海康威视数字技术股份有限公司 | 一种针对曼彻斯特编码的解码方法及装置 |
CN112491763B (zh) * | 2020-11-30 | 2022-09-27 | 杭州海康威视数字技术股份有限公司 | 一种针对曼彻斯特编码的解码方法及装置 |
CN112235218A (zh) * | 2020-12-15 | 2021-01-15 | 广州智慧城市发展研究院 | 曼彻斯特信号解码方法及装置 |
CN112235218B (zh) * | 2020-12-15 | 2021-03-16 | 广州智慧城市发展研究院 | 曼彻斯特信号解码方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN104868921B (zh) | 2018-05-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104868921A (zh) | 一种解码方法及装置 | |
CN106415517B (zh) | Usb 3.1重定时器存在检测和索引的方法与装置 | |
CN104132663A (zh) | 一种基于fpga的导航计算机协处理器 | |
US8291136B2 (en) | Ring buffer | |
CN107145430A (zh) | 一种基于I2C接口通过CPLD来实现NVMe SSD点灯的方法 | |
CN103150146A (zh) | 基于可扩展处理器架构的专用指令集处理器及其实现方法 | |
CN110515589B (zh) | 乘法器、数据处理方法、芯片及电子设备 | |
CN102768648B (zh) | 低延迟中断收集器、具有该收集器的系统和相关方法 | |
CN101727422A (zh) | 一种控制单总线设备的方法及系统 | |
JP2017531861A (ja) | 機械命令を実行することによってデータをある形式から別の形式に変換する方法、コンピュータ・プログラム、およびコンピュータ・システム | |
US20140201506A1 (en) | Method for determining instruction order using triggers | |
JP2017531860A (ja) | 機械命令を実行することによってデータをある形式から別の形式に変換する方法、コンピュータ・プログラム、およびコンピュータ・システム | |
CN115269006A (zh) | 机器码指令转换方法、装置、电子设备及可读存储介质 | |
CN101246465A (zh) | 通用串行总线芯片 | |
CN116594930A (zh) | 一种基于流水线的数据传输控制方法、系统及电子设备 | |
EP4203376A1 (en) | Frame alignment recovery for a high-speed signaling interconnect | |
RU175051U1 (ru) | Процессорный модуль | |
CN205281474U (zh) | 一种可配置的两级流水线六操作数快速加法器 | |
US9128758B2 (en) | Encoding densely packed decimals | |
TWI723051B (zh) | 用於串擾駕馭式傳訊的以邏輯為基礎之解碼器 | |
CN209895329U (zh) | 乘法器 | |
CN103399727A (zh) | 硬件整数饱和侦测器、侦测饱和的方法及其硬件装置 | |
WO2021042836A1 (zh) | 一种去除毛刺的方法、装置及状态机 | |
CN102969011B (zh) | 基于dsp和usb的实时语音存储系统及存储方法 | |
WO2021061260A1 (en) | System, device, and method for obtaining instructions from a variable-length instruction set |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |