串口通信为什么要设置波特率?想要知道这个答案,首先我们先了解一下什么是波特率:
波特率 (Baud Rate) 单位 bps — 是码元传输速率 单位(Baud,symbol/s),单位时间传输了多少个码元
波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示,其单位是波特 (Baud)。
有两种比较可靠的说法:
1、根据电、传输介质等的物理特性结合串口设备使用的要求
为了保证有效通讯,根据电、传输介质等的物理特性结合串口设备使用的要求,确定 RS232 最大传输速率只能是 115200,然后逐递减得到 57600,38400,28800,19200,9600… 为适应这些速率,设计相应的晶振频率。
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))
3212(256-TH1)=(2SMOD*OSC_FREQ(Hz))/BAUD_RATE
256-TH1=(2SMODOSC_FREQ(Hz))/(BAUD_RATE32*12)
TH1=256-(2SMODOSC_FREQ(Hz))/(BAUD_RATE32*12)
假设晶振频率为 11.0592MHz,波特率为 9600,SMOD=0,TH1 初值应该为多少呢?根据上面公式可以计算得 TH1=256-11059200/(96003212)=0xFD。
1GB=1024MB
1MB=1024KB
1KB=1024B(字节)
我们需要串口接收的数据数每秒 512 字节,串口的波特率是115200位/秒
波特率 115200=115200(位 / 秒)
如果没有校验位,就应该除以 10,得到的是每秒字节数:波特率 115200=115200(位 / 秒)=11520(字节 / 秒)
再除以 1024,就是每秒 KB 数:波特率 115200=115200(位 / 秒)=11.25(KB / 秒) 也就是满足每秒可以接收 512 字节。
(来源:网络)
https://blog.csdn.net/weixin_39636608/article/details/111126896