波特率和比特率【串口为例】

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

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

比特率:

  每秒钟通过信道传输的信息量称为位传输速率,也就是每秒钟传送的二进制位数,简称比特率。比特率表示有效数据的传输速率,用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

 

posted @ 2015-12-25 15:32  oucaijun  阅读(6195)  评论(0编辑  收藏  举报
下载TeamViewer完整版 下载TeamViewer