波特率和比特率【串口为例】
使用单片机串口常看到波特率这个名词,并根据它来调整串口的时钟。
波特率其实并非直接反映了串口传输速率(时钟频率),实际上,比特率更能直接反应信号的传输速率(时钟频率)。
比特率:
每秒钟通过信道传输的信息量称为位传输速率,也就是每秒钟传送的二进制位数,简称比特率。比特率表示有效数据的传输速率,用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