串口波特率|为了搞清楚串口通信为啥设置波特率

串口波特率(为了搞清楚串口通信为啥设置波特率)
串口通信为什么要设置波特率?想要知道这个答案 , 首先我们先了解一下什么是波特率:
什么是波特率?波特率(Baud Rate)单位 bps -- 每秒传送的字节数 Byte Per Second 。
波特率表示每秒钟传送的码元符号的个数 , 是衡量数据传送速率的指标 , 它用单位时间内载波调制状态改变的次数来表示 。波特率是指数据信号对载波的调制速率 , 它用单位时间内载波调制状态改变的次数来表示 , 其单位是波特(Baud) 。
串口波特率|为了搞清楚串口通信为啥设置波特率



串口通信为什么要设置波特率?有两种比较可靠的说法:
1、根据电、传输介质等的物理特性结合串口设备使用的要求
为了保证有效通讯 , 根据电、传输介质等的物理特性结合串口设备使用的要求 , 确定RS232最大传输速率只能是115200 , 然后逐级二分得到57600 , 28800 , 19200……为适应这些速率 , 设计相应的晶振频率 。
串口波特率|为了搞清楚串口通信为啥设置波特率



2、这是由电信线路特性决定的
电话线路的带通是300--3KHz , 当时hayes先搞的modem , 所以用的2400HZ信号 , 对应波特率是2400 。由于基本频率确定了 , 以后采用的提高通讯速率的方法都是在2400基础上倍频的 , 所以形成了9600.19200……
不管哪种说法 , 都是先有波特率再有晶振频率 。
串口波特率|为了搞清楚串口通信为啥设置波特率



单片机串口通信波特率计算在模式0和模式2下 , 串口波特率固定 , 模式0为Fosc/12 。模式2为Fosc/32或Fosc/64 , 具体由PCON寄存器的百思特网SMOD位决定 。
在模式1和模式3下 , 波特率是一个可变值 , 波特率可以由定时器1产生(8052可以由定时2产生) , 那么波特率到底为多少呢?
波特率由定时器1的溢出率来决定:
Baud Rate = (2SMOD/32)*(Timer 1 Overflow Rate)
注意:2SMOD这里的SMOD是指数 , SMOD为波特率双倍波特率位 , 该位在PCON寄存器中 。

【串口波特率|为了搞清楚串口通信为啥设置波特率】

当使用timer 1作为波特率产生器时 , 通常需要将timer 1配置成8位自动重装的工作模式下 , 同时还要禁止timer 1中断 , 那么timer 1的溢出率是怎样计算的呢?溢出率即溢出的频率 , 假设晶振频率为12MHz , TH1值为0xFE , 则只需要两个时钟脉冲就会溢出 , 溢出的周期为2us , 那么溢出的频率就为500KHz 。
串口波特率|为了搞清楚串口通信为啥设置波特率



根据定时器一节 , 定时时间有如下计算公式:
定时时间=(最大计数值-计数器初值)*机器周期=(最大计数值-计数器初值)*(12/晶振频率(Hz))(s)=(256-TH1)*(12/OSC_FREQ(Hz))(s) 。
那么溢出频率自然就为:
OSC_FREQ(Hz)/((256-TH1)*12) 。
所以最后推导出波特率为:
(2SMOD/32)*(OSC_FREQ(Hz)/((256-TH1)*12)) 。
串口波特率|为了搞清楚串口通信为啥设置波特率



波特率的计算公式有了 , 那自然就可以根据波特率推导出TH1的初值了:
BAUD_RATE=(2SMOD/32)*(OSC_FREQ(Hz)/((256-TH1)*12))
32*12*(256-TH1)=(2SMOD*OSC_FREQ(Hz))/BAUD_RATE
256-TH1=(2SMOD*OSC_FREQ(Hz))/(BAUD_RATE*32*12)
TH1=256-(2SMOD*OSC_FREQ(Hz))/(BAUD_RATE*32*12)
串口波特率|为了搞清楚串口通信为啥设置波特率



假设晶振频率为11.0592MHz , 波特率为960百思特网0 , SMOD=0 , TH1初值应该为多少呢?根据上面公式可以计算得TH1=256-11059200/(9600*32*12)=0xFD百思特网 。
波特率和字节的关系1GB=1024MB
1MB=1024KB
1KB=1024B(字节)
我们需要串口接收的数据数每秒512字节 , 串口的波特率是115200位/秒
波特率115200=115200(位/秒)
如果没有校验位 , 就应该除以10 , 得到的是每秒字节数:波特率115200=115200(位/秒)=11520(字节/秒)
再除以1024 , 就是每秒KB数:波特率115200=115200(位/秒)=11.25(KB/秒)也就是满足每秒可以接收512字节 。