zoukankan      html  css  js  c++  java
  • 波特率和比特率【串口为例】

    使用单片机串口常看到波特率这个名词,并根据它来调整串口的时钟。

    波特率其实并非直接反映了串口传输速率(时钟频率),实际上,比特率更能直接反应信号的传输速率(时钟频率)。

    比特率:

      每秒钟通过信道传输的信息量称为位传输速率,也就是每秒钟传送的二进制位数,简称比特率。比特率表示有效数据的传输速率,用b/s 、bit/s、比特/秒,读作:比特每秒。

    波特率:

      波特率反映的是每秒传输的数据元个数。

      严格说来,波特率与比特率的关系也可换算成:比特率=波特率*单个调制状态对应的二进制位数。如果数据不压缩,波特率等于每秒钟传输的数据位数,如果数据进行了压缩,那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒偶尔会产生错误。两相调制(单个调制状态对应1个二进制位)的比特率等于波特率;四相调制(单个调制状态对应2个二进制位)的比特率为波特率的两倍;八相调制(单个调制状态对应3个二进制位)的比特率为波特率的三倍;依次类推。

      

    最终,回到实际使用中来,在嵌入式的串口通信中,比特率和波特率往往相同(比如在S3C2440中,所说的波特率 = 比特率)。

    对于我们常用的串口,我们经常用波特率来表示传输速度,而这时其值就是比特率,通过S3C2440的串口通信得以证明:

    在S3C2440的datasheet里面有说到,

    “For example, if the baud-rate is 115200 bps and UART clock is 40 MHz, UBRDIVn is:

    UBRDIVn = (int)(40000000 / (115200 x 16) ) -1
    = (int)(21.7) -1 [round to the nearest whole number]
    = 22 -1 = 21”

    按照它的介绍,在设置寄存器使其波特率等于115200 ,然后用逻辑分析仪采样。

    #define UART_BAUD_RATE 115200 // 波特率
    #define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
    
    void uart0_init(void)
    {
    
      ...
    
      UBRDIV0 = UART_BRD; // 波特率为115200
    }
     

     逻辑分析仪采样结果如下: 可以看出实际采集结果==理论值。 理论上1 bit时间 = 1/ 115200 = 8.68us; 

    串口传输2个字节0x0f的采样图

     

     串口通讯的数据格式 

    停止位可能是1、1.5、2 bit

  • 相关阅读:
    跟vczh看实例学编译原理——二:实现Tinymoe的词法分析
    跟vczh看实例学编译原理——一:Tinymoe的设计哲学
    跟vczh看实例学编译原理——零:序言
    2013年终总结
    如何设计一门语言(十二)——设计可扩展的类型
    开始用Word 2013来写博客
    如何设计一门语言(十一)——删减语言的功能
    如何设计一门语言(十)——正则表达式与领域特定语言(DSL)
    链表
    结构的学习
  • 原文地址:https://www.cnblogs.com/mylinux/p/5076095.html
Copyright © 2011-2022 走看看