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


在旧的台式计算机中,通常有一个RS-232标准的COM端口(也称 DB9 接口):

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

文章插图


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

文章插图


发送一位数据的时间约为8.667us,因此可以计算出一秒钟发送多少位数据:
计算出的波特率为115380bps,非常接近115200bps 。最后,肯定是有一定的错误 。这个错误的原因包括逻辑分析仪的质量和我们的测量环境 。但这个误差也在允许范围内 。您可以看到串口助手接收到的数据是否正确:
怎么测量实际的波特率、比特率? 串口波特率

文章插图


可以看到接收到的数据是正确的,即波特率是正确的 。
串口波特率对不上怎么解决?
在实践中 。我们可能会遇到这样情况,即代码中配置的波特率与串口助手上设置的波特率相同,但仍然存在一个异常 。
例如,如果我们向串口助手发送一个字符串,那么应该显示在串口助手上的字符串就被乱码了 。或者我们发送一个数据到串口助手,发现数据被移动了 。
在这种情况下,大多数波特率都不对应,因此我们必须检查底层文件 。如果代码中波特率计算相关值(时钟)与实际情况不符,就会出现这样的现象 。例如,我的一位同事以前遇到过这种情况,这就是原因 。
在使用STM32时,通常使用外部晶体振荡器,如STM32F103系列 。外置晶体振荡器的输入范围为4~16mhz:
怎么测量实际的波特率、比特率? 串口波特率

文章插图


经验值一般为8MHz,而且一般的demo工程底层代码里默认的也是设置为8MHz,比如:
怎么测量实际的波特率、比特率? 串口波特率

文章插图


但是如果实际晶体振荡器没有粘贴8m,就会出现问题(例如串口波特率不正确) 。追溯到源代码,串口波特率被分配到USART_Init函数中的,打开这个函数:
怎么测量实际的波特率、比特率? 串口波特率

文章插图


计算串口波特率需要一个apbclock变量,而这个值得来源从RCC_GetClocksFreq函数来,再打开这个函数:
怎么测量实际的波特率、比特率? 串口波特率

文章插图


所以要注意的是,HSE_VALUE这个值要与实际做对应 。
遇到这种问题找谁说理去 。经验就是不断采坑不断积累的一个过程,早点遇到坑可能也是一件好事 。像类似底层的问题很少遇到,但是一旦遇到那就得比较棘手的问题了,需要很有耐心地去查找 。
能用稳定的芯片是一件很幸福的事情,用不稳定、不成熟的芯片的时候,那个才是真的难啊,遇到问题真是让人怀疑人生啊,软件、硬件、芯片都可能有问题 。


推荐阅读