笔者前几天碰到了串口波特率的问题,想要1M以上的波特率,发现波特率总是乱码,常用标准的几种波特率也不是很好用。

1、UART时钟情况说明

ch340G模块,时钟为12MHZ。

android 波特率适配 波特率选择_android 波特率适配

某PMC开发板,ARM Coretex A53内核,主频为1.6G,串口时钟为6.25MHZ,理论最大支持2Mbit/s。
该开发板的串口波特率是通过分频而来。

Baud Rate = 625000/(UDLH <<8+UDLL)

android 波特率适配 波特率选择_串口通信_02

2、理论计算

当选择常用的波特率时,开发板分出的波特率时钟的偏差

波特率

总时钟

分频系数

误差计算

115200

6250000

54

0.47%

128000

6250000

48

1.7%

230400

6250000

27

0.47%

256000

6250000

24

1.7%

468000

6250000

13

4.3%

512000

6250000

12

1.7%

921600

6250000

7

3.1%

1000000

6250000

6

4.1%

1024000

6250000

6

1.7%

2000000

6250000

3

4.1%

波特率误差计算说明:由于波特率是由总时钟分频而来,所以分频系数必须是整数。(由上面寄存器可知,总不能向寄存器写入小数吧)

误差率 = (总时钟/分频系数 – 波特率)/波特率。
分频系数 = int(总时钟/波特率)。最好取4舍5入,可以减少误差。

选择上述的波特率范围原因是:串口转USB的模块支持上述波特率,

正常波特率的接收误差范围要小于2%,为了稳定通信要小于1%,(因为)且当前串口线较长,超过15cm

3、实际测试

双方通信测试(乱码测试),基于CH340测试。
921600 测试乱码
1000000 测试乱码
1024000 测试乱码 (256000*4)
2000000 测试乱码

示波器采用KeySight(是德MSO X3054T),带宽为500MHZ,采样率5GSa/s,

android 波特率适配 波特率选择_uart_03

对于板子的时钟,是否与实际的符合也做了测试。

发送和接收均是针对Host端来说的。

频率的抓取位置均是通过示波器自动完成的。

(1)115200波特率的测试抓取。(发送)

android 波特率适配 波特率选择_android 波特率适配_04

115200波特率的测试抓取。(接收)

android 波特率适配 波特率选择_示波器_05

6250000/54 = 115740HZ,和抓到的波形频率一致。

(2)1562500波特率测试(6250000/4 = 1562500 恰好整除)(接收,即开发板生成)

android 波特率适配 波特率选择_uart_06

串口工具设置的频率若为1562500,(发送),选择那种可以自己设置波特率的串口工具。

比如Mobaxterm以及SecureCRT。

android 波特率适配 波特率选择_波特率_07


android 波特率适配 波特率选择_波特率_08

android 波特率适配 波特率选择_波特率_09

抓取的发送频率为:1.4966MHZ,误差率为:4.2%.
两个波特率的测试,基本可以确定开发板的波特率总时钟是OK的。
但是无法支持1M以上的波特率。

4、最大波特率问题

不太好确定双方都支持的最大波特率。即双方的波特率目前512000(误差率低于2%,可能误码率交高)是找到最大的且符合误差范围的波特率值。

  • 串口工具上常见的波特率,512000之上的开发板都不支持,即计算出来的误差率较高。
  • 1024000波特率是因为串口模块支持能力有限,虽然说得支持2MHz,但是实际测试下来误差较大。
    (CH340G与PL2302 在相同波特率下(1M以上)测试,无法正常通信)。
  • 其实我们经常看到51单片机或者串口模块的晶振选择11.05625MHZ,其实原因是特定晶振分出的串口波特率时钟偏差小。

由下表可以看到11.0592MHZ的时钟偏差比12MHZ要小。

时钟

波特率

分频系数

误差

11.0592MHZ/12MHZ

9600

1152/1250

0%/0%

11.0592MHZ/12MHZ

115200

96/104

0%/0.16%

11.0592MHZ/12MHZ

230400

48/52

0%/0.16%

11.0592MHZ/12MHZ

256000

43/47

0.47%/0.26%

11.0592MHZ/12MHZ

460800

24/26

0%/0.16%

11.0592MHZ/12MHZ

921600

12/13

0%/0.16%

假如我们不选择这种串口模块,其实可以配置成任意的波特率,只要符合一定范围内的误差就行。

5、波特率提高

再选择另外一种串口模块之后(CMSIS DAPLink 支持虚拟串口),波特率在1.5625Mhz可以成功通信。因为开发板4分频正好为1.5625Mhz。

发送时钟频率(串口模块)

android 波特率适配 波特率选择_波特率_10


接收时钟频率(开发板发送时钟频率,相对概念)

android 波特率适配 波特率选择_示波器_11


误差计算为:0.064%,符合范围,可以正常通信。

android 波特率适配 波特率选择_uart_12

6、总结

0、发送乱码原因:模块支持M级别波特率的问题。
1、选择常用固定的波特率是因为:ch340或者其他模块的时钟可以对这些常见波特率进行整分频。
2、发现PL2302和CH340G在1M以上的波特率无法通信。
3、如果需要较高的波特率(比如1M以上),需要看看模块是否满足,可以通过示波器来看,计算一下误差
4、选择用一些可以自己设置波特率的串口工具,比如SecureCRT、Mobaxterm等。
5、下次测试一下STM32的波特率支持情况
6、波特率以及比特率的理解增加