曼彻斯特编码(转)

来源于:https://www.cnblogs.com/mr-bike/p/4262458.html  

常见的编码方式有以下几种,

  1、NRZ(Not Return to Zero)不归零编码, 这是一种比较简单的编码方式,二进制数据“0”和“1”分别用高电平和低电平来表示,当1位数据传输完以后,信号电平

     不返回零所以称为不归零编码。

 

  2、BiPhase编码, 相比NRZ编码方式,这种编码稍微复杂了一点,他是这样规定,在每一位数据传输时,电平都会跳变(高电平变低电平,或者低电平变高电平),

          同时当数据为“1”时(按照规定也可以是“0”),在数据位中间也会跳变。

 

  3、曼彻斯特编码方式, 这种编码方式利用信号的边沿来表示二进制数据“0”和“1”,比如信号的上身沿表示“1”,下降沿表示“0”,而这种跳变一般发生在位帧的中间。

 

  以上3中编码方式的波形如下图所示,

    

        图1  常见编码方式波形图

 

  曼彻斯特编码

  假设信号的上升沿表示“0”, 下降沿表示“1”,同时假设数据的波特率为f, 那么一个位的时长为1/f,那么位帧的中间时长为1/2f,我们用T来表示这个半个位帧的时长。

  有了以上的假设条件,那么曼彻斯特的编码流程如下,

    1. 首先I/O口输出高电平。

    2. 检查数据是否发送完成,如果是,跳到步骤7。

    3. 检查下一个数据位的值。

    4. 如果是“1”,调用发送1的函数ManchesterOne(T)。

    5. 如果是"0",调用发送0的函数ManchesterZero(T)。

    6. 返回到步骤2。

    7. I/O输出为高电平并返回。

 

    ManchesterOne(T)的执行过程

      1. I/O 输出低电平。

      2. 等待半位帧时间T。

      3. I/O输出高电平。

      4. 等待半位帧时间T。

      5. 返回。

    ManchesterZero(T)的执行过程

      1. I/O 输出高电平。

      2. 等待半位帧时间T。

      3. I/O输出低电平。

      4. 等待半位帧时间T。

      5. 返回。

 

  曼彻斯特解码

  曼彻斯特解码过程要比编码复杂,一般的,解码过程有以下步骤:

    1. 获取数据流的波特率(或者已知数据流的波特率)。

    2. 同步数据流的时钟信号(实质是区分位帧边沿和半位帧边沿)。

    3. 根据上面两步对数据流进行解码。

 

  假设的条件和编码时一样,具体的实现步骤如下,

    1. 将定时器的捕获中断设置为所有边沿(对于没有上升沿和下降沿同时捕获的MCU,需要在中断处理函数里改变捕获沿)。

    2. 中断函数里处理捕获标志位和捕获值。

    3. 开启定时器,捕获第一个边沿并丢弃。

    4. 捕获下一个边沿,检查捕获值是否等于2T(T = 1/2f,其中f为数据流的波特率。

    5. 重复步骤4,直到捕获值等于2T(此时就和数据流的时钟同步了)。

    6. 读取当前I/O信号的电平值,并保存为当前位的值(0或者1)。

    7. 捕获下一个边沿

      a. 捕获值和T比较

      b. 如果捕获值等于T

        i.  捕获下一个边沿同时确定该捕获值也等于T(如果不等说明编码错误)

        ii. 下一位的值和当前值相同

        iii. 返回该值

      c. 如果捕获值等于2T

        i. 下一位的值和当前值相反

        ii. 返回该值

      d. 否则返回错误

    8. 保存下一位的值到缓存

    9. 如果接收到的数据位达到要求,返回对数据做进一步处理

    10. 否则更新当前值(设置为下一位的值),重复步骤7

 

    下图展示的是这种解码方式的一个示意图,

    图2 曼彻斯特解码示意图

  总结

  总的来说,编码和解码还是比较简单的,曼彻斯特的典型应用是在RFID领域里标签读取。另外,上面假设上升沿表示“1”,下降沿表示“0”,对于相反的情况(即上升

  沿表示“0”,下降沿表示“1”),解码过程处理不同的地方在步骤6,假如同步到数据流的时钟,对于上升沿表示“1”,下降沿表示“0”的情况,当前位的值和读取到的I/O

  的值相同;对于上升沿表示“0”,下降沿表示“1”的情况,当前位的值和读取到的I/O的值相反。

注解:如涉及侵权行为,请联系删除

曼彻斯特编码(Manchester Coding)和差分曼彻斯特编码(Differential Manchester Coding)都是数字通信中常用的编码方式。 曼彻斯特编码是一种基带编码方式,将每个数据位换为一个信号时段,信号时段分为两个等长的部分,每个部分表示一个比特,数据“1”表示上电平和下电平的换,数据“0”则表示下电平和上电平的换,即数据被编码为高-低或低-高两种可能。这种编码方式的优点是,在传输数据时,接收方可以根据信号时段的变化判断数据是“1”还是“0”,且不需要传输数据的时钟信号,缺点是传输速率较低,信号中的连续高低电平换频繁,导致带宽占用较高。 差分曼彻斯特编码是对曼彻斯特编码的一种改进,它不仅包含了数据本身的信息,还包含了数据的变化方向信息。在差分曼彻斯特编码中,每个数据位被编码为一个信号时段,信号时段分为两个等长的部分,每个部分表示一个比特,数据“0”表示两个部分的电平相同,数据“1”则表示两个部分的电平不同。这种编码方式的优点是传输速率高,较曼彻斯特编码来说,信号中的连续高低电平换频繁,但只有在数据发生变化时才会发生,带宽占用较低。其缺点是需要传输数据的时钟信号,且解码较为复杂。 总体来说,曼彻斯特编码和差分曼彻斯特编码都有自己的优缺点,具体选择哪种编码方式取决于具体应用场景和需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值