怎么测量实际的波特率、比特率? 串口波特率


怎么测量实际的波特率、比特率? 串口波特率

文章插图
串行波特率(如何测量实际波特率和比特率?)
通常用串口打印乱码是因为串口的波特率不对 。那么我们应该如何测量实际的波特率呢?在此之前,我们先来回顾一下波特率的概念 。

什么是波特率和比特率?
比特率的英文单词是Bitrate,表示每秒传输的二进制数字的个数,单位是比特每秒(bit/s) 。
波特率(Baudrate)是波特率的英文单词,表示每秒传输的符号数,是衡量数据传输速率的指标 。
符号是通信信号调制的概念 。通信中通常用具有相同时间间隔的符号来表示二进制数 。这种信号称为符号 。
在普通的通信传输中,0V代表数字0,5V代表数字1,所以一个符号可以代表0和1两种状态,所以一个符号等于一个二进制位,波特率和比特率是一致的 。

如果0V、2V、4V、6V在通信传输中分别代表二进制数00、01、10、11,那么每个符号可以代表四种状态,即两个二进制位,那么符号数就是二进制位数的一半,此时的波特率就是比特率的一半 。
因为在很多常见的通信中,比如串行通信,一个符号代表两种状态,所以我们通常直接用波特率来表示比特率 。
串行通信协议
在串行通信的协议层,它规定了数据包的内容,由起始位、主数据、校验位和停止位组成 。通信双方的数据包格式要一致,这样才能正常发送和接收数据 。框架的组成如下:

让我们实际验证一下数据帧是否真的是这样,并编写下面的代码:

代码很简单,就是利用串口连续发送数据0xAA(当然也可以发送其他数据) 。我们的串口配置如下:

我们可以用示波器或逻辑分析仪抓取实际信号,看看数据是否符合上述格式 。这里,我们使用逻辑分析仪捕捉usart1的传输信号线(TX ):

从实际结果来看,确实是按照帧格式发送的 。有些人可能对此有疑问 。上面数据框的图片中有空空闲状态 。这是什么?空 idle,空 idle,当然不是在发送数据的状态 。我们将代码改为:

初始化后,仅发送一个0XAA,逻辑分析仪捕获的数据为:

【怎么测量实际的波特率、比特率? 串口波特率】可以看出空的空闲状态较高 。在前面的例子中,我们在while循环中发送了数据0XAA,所以没有空空闲状态 。
在这个实验中,我们需要知道两件事:
串行端口发送的数据是第一个低位 。我们的MCU发送0XAA(10101010B),逻辑分析仪采集的有效数据是01010101b 。
单片机的串口使用TTL电平,是正逻辑电平信号 。逻辑分析仪采集的数据0对应实际电压0~0.5V,数据1对应实际电压2.4v~5V ~ 5 V 。
RS-232电平标准经常与TTL电平标准相比较 。举个例子,

TTL电平标准常用于普通电子电路 。在理想状态下,5V代表二进制逻辑1,0V代表逻辑0 。为了提高串行通信的远距离传输和抗干扰能力,RS-232电平标准用-15V表示逻辑1,用+15V表示逻辑0 。
在老式台式计算机中,通常有一个RS-232标准COM端口(也称为DB9接口):

在这个示例程序中,我们将串行端口波特率设置为115200bps 。在串行通信中,符号只由一个二进制数表示(即只有0和1),所以波特率和比特率是相等的 。
比特率代表每秒传输的二进制数字的数量,因此我们知道传输一位数据的时间 。我们能推导出波特率吗?从逻辑分析仪中,我们可以知道发送一位数据的时间如下:

发送一位数据的时间大概是8.667信息资源网U信息资源网S所以你可以计算一下一秒钟发送多少位数据:
计算出的波特率为115380bps,非常接近115200bps 。最后,肯定有一些错误 。产生这种误差的原因包括逻辑分析仪的质量和我们的测量环境 。但这个误差也在信息资源网允许的范围内 。您可以查看串行助理接收的数据是否正确:

可以看出,接收的数据是正确的,也就是波特率是正确的 。
串口波特率不匹配怎么办?
在实践中 。我们可能会遇到这样的情况,代码中配置的波特率与串行助手上设置的波特率相同,但还是有例外 。
例如,如果我们向串行助手发送一个字符串,那么应该在串行助手上显示的字符串将会是乱码 。或者我们发送一个数据给串口助手,发现数据被移动了 。
在这种情况下,大多数波特率不对应,所以我们必须检查底层文件 。如果代码中的波特率计算相关值(时钟)与实际情况不符,就会出现这种情况 。比如我的一个同事以前也有过这种情况,就是这个原因 。


推荐阅读