ArterySW 发表于 2023-11-1 15:00

SC0121_串口波特率自动检测

本帖最后由 ArterySW 于 2023-11-1 15:02 编辑

SC0121_USART_Software_Auto_Baud_Rate_Detection
示例目的
展示通过软件方式如何实现USART自动检测波特率功能。

1 简要概述
本例程主要介绍如何用软件方式实现串口自动波特率功能。
实现原理:
通过软件量测USART起始位(start bit)的宽度,计算出USART分频值,实现自动波特率功能。

注意:在量测阶段的时候,主机端发送的第一个字节的第1位必须为1, 也就是起始位后的第一个bit必须为1,如上图,否则量测不准。例如可以发送 0Xa1, 0x55, 0x33…等
实现方法步骤:
1)初始化TMR,EXINT
2)通过EXINT监测USART RX,当产生上升沿或者下降是,记录下当前的TMR计数值。
3)当产生了两个沿时,一个下降沿和一个上升沿,表示已经量测到起始位
4)等待1ms,等待当前这一个byte数据接收完成
5)计算当前收到的数据,并计算出当前USART的分频值
6)发送一个确认数据0x55表示校准完成
注意:例程使用TMR6, USART2(PA2,PA3), 如果需要修改为其它串口或者TMR,可修改代码里面对于的宏定义

2 快速使用方法
2.1 硬件资源
1) AT-START-F437实验板,如下是437实验板;
图1. AT-START-F437 V1.1开发板

2) USB转串口工具

2.2 软件资源
1) SC0121_SourceCode
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考
AT32xxx_Firmware_Library_V2.x.x\project\at_start_xxx\templates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。

2.3 示例使用
1) 将USB转串口工具的RX,TX接到USART2的TX(PA2),RX(PA3)
2) 打开SourceCode\SC0121_SourceCode_V2.0.0\utilities\ usart_auto_baud_rate_detection\ mdk_v5源程序;
3) 将代码编译后下载到实验板;
4) 在PC上打开串口助手,选择对应的串口,通过串口助手发送数据一个数据 0x55;
5) 如果PC收到0x55,表示自动波特率检测成功




lajfda001 发表于 2023-11-2 08:56

自动识别串口波特率吗?

lihuami 发表于 2023-12-3 22:45

需要预先设定校验数据,而且对于不同长度的数据,需要分别设定校验数据,实现起来比较繁琐。

yeates333 发表于 2023-12-4 10:50

测量到两个上升沿间的时间,除以8就可以得到一位的时间,求个倒数就是波特率了。

modesty3jonah 发表于 2023-12-4 11:42

如果接收到的数据与发送的数据一致,则说明波特率正确,否则就需要调整波特率。这种方法的优点是可以自动适应不同的波特率,但是缺点是需要精确地控制延时时间,实现起来比较复杂。

mollylawrence 发表于 2023-12-4 14:41

硬件自动检测方法根据检测波特率方式的不同,ABR又分为4种模式。

iyoum 发表于 2023-12-4 15:32

在单片机端口接收到字符后,根据接收到的起始位和结束位以及字符的长度,计算接收到的实际波特率

jackcat 发表于 2023-12-5 10:27

单片机的串口波特率自动检测功能,通常被称为ABR

adolphcocker 发表于 2023-12-5 10:54

软件检测方法适用于所有单片机,通过把RX引脚设置为输入捕获模式,让对方发送一个字节的数据(最好是0x7F),通过测量边缘时间来计算波特率

vivilyly 发表于 2023-12-5 12:02

如果差异在允许的范围内(例如5%),则认为接收到的波特率是正确的。否则,说明接收到的波特率存在误差。

jkl21 发表于 2023-12-5 14:44

在接收到一定数量的数据后,可以通过计算接收到的数据的时间和数据量来推算出当前的波特率,并与预设的波特率范围进行比较,以确定当前的波特率是否在预设的范围内。

juliestephen 发表于 2023-12-5 15:05

虽然串口自动波特率检测功能非常实用,但在某些情况下可能会出现误判的情况

51xlf 发表于 2023-12-5 15:28

发送数据时,根据波特率设定一个合理的延时时间,然后在接收端等待相同的时间后再开始接收数据

mmbs 发表于 2023-12-5 15:47

串口波特率自动检测需要一定的时间和计算资源,可能会影响到单片机的性能和稳定性。

maudlu 发表于 2023-12-5 17:37

采用时间测量法或特征值匹配法进行波特率检测。

i1mcu 发表于 2023-12-5 20:07

自动波特率检测功能内置了各种模式用于不同字符的检测

hjl2832 发表于 2023-12-6 08:16

波特率容易计算,怎么计算出校验位和数据位才是关键。

caigang13 发表于 2023-12-6 11:10

波特率自适应就是识别脉冲宽度

jackcat 发表于 2023-12-6 15:24

上位机接收到单片机的请求后,会以一定的波特率发送回车符(0x0D)给单片机。

pentruman 发表于 2023-12-6 16:20

单片机接收到上位机的回车符后,开始计算上位机的波特率。
页: [1] 2
查看完整版本: SC0121_串口波特率自动检测