[编码] 曼彻斯特编码与解码

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

  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的值相反。

    

时间: 2024-10-13 18:56:50

[编码] 曼彻斯特编码与解码的相关文章

曼彻斯特编码

曼彻斯特编码(Manchester Encoding),也叫做相位编码( Phase Encode,简写PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据.它在以太网媒介系统中的应用属于数据通信中的两种位同步方法里的自同步法(另一种是外同步法),即接收方利用包含有同步信号的特殊编码从信号自身提取同步信号来锁定自己的时钟脉冲频率,达到同步目的. 曼彻斯特编码,常用于局域网传输.曼彻斯特编码将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位

iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像

iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像 本文档基于H.264的解码,介绍读写Video Toolbox解码回调函数参数CVImageBufferRef中的YUV或RGB数据的方法,并给出CVImageBufferRef生成灰度图代码.方便调试.同时,还介绍了Video Toolbox解码回调中进行YUV处理时容易忽略的问题.文档定位于iOS音视频高级编程,致力于提供高参考价值的Core Video中文资料,最近也在StackO

url编码base编码解码十六进制

0x25346425353425343525333525343325366125343525373725346425353125366625373825346425343425363725346225346625353425366225346225346425353425343525373825343325366125343525373725346625353125366625373825346425343425343525346225346425353425343525333225343325

(差分)曼彻斯特编码及NRZ

曼彻斯特编码(Manchester Encoding),也叫做相位编码( Phase Encode,简写PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据.它在以太网媒介系统中的应用属于数据通信中的两种位同步方法里的自同步法(另一种是外同步法),即接收方利用包含有同步信号的特殊编码从信号自身提取同步信号来锁定自己的时钟脉冲频率,达到同步目的. 曼彻斯特编码,常用于局域网传输.曼彻斯特编码将时钟和数据包含在数据流中,在传输代码信息的同时,也将时钟同步信号一起传输到对方,每位

javac编译出现的编码错误: 编码GBK的不可映射字符

在Windows平台下,当Java源代码中包含中文字符时,如果我们利用代码编辑器保存代码时是utf-8编码格式保存,那么我们在用javac编译时会出现“错误:编码GBK的不可映射字符”. 我们在用javac编译时,编译程序首先会获得我们windows操作系统默认采用的编码格式(GBK),这样在从硬盘读取java文件的时候就相当于按GBK格式解码进内存中,而原编码为utf-8,就会发生解码错误,导致无法编译.当我们不加设置就编译时,相当于使用了参数:javac -encoding GBK Stre

Mysql编码, Mysql编码流程, Mysql编码顺序, Mysql编码原理, Mysql编码修改依据

编码查看方式以及解释说明: 需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:>mysql -u root –p,之后两次输入root用户的密码),查看数据库的编码方式命令为: >show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +-----------------------

UFLDL教程笔记及练习答案六(稀疏编码与稀疏编码自编码表达)

稀疏编码(SparseCoding) sparse coding也是deep learning中一个重要的分支,同样能够提取出数据集很好的特征(稀疏的).选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基本元素的叠加,在图像中这些基本元素可以是面或者线. 稀疏编码算法的目的就是找到一组基向量使得我们能将输入向量x表示成这些基向量的线性组合: 这里构成的基向量要求是超完备的,即要求k大于n,这样的方程就大多情况会有无穷多个解,此时我们给

Python判断字符串编码以及编码的转换

判断字符串编码 使用 chardet 可以很方便的实现字符串/文件的编码检测.尤其是中文网页,有的页面使用GBK/GB2312,有的使用UTF8,如果你需要去爬一些页面,知道网页编码很重要 >>> import urllib >>> html = urllib.urlopen('http://www.chinaunix.net').read() >>> import chardet >>> chardet.detect(html) {

JAVA IO ( 编码_乱码_解码 )

public class Index { public static void main(String[] args) { String s = "黄伟强"; try { // 编码(编码方式 GBK:国标 UTF-8:国际通用 ISO-8859-1:美洲 默认为当前项目的编码) byte[] b = s.getBytes("UTF-8"); System.out.println(Arrays.toString(b)); // 乱码的解码方式(编码和解码使用不同的字