打印
[应用相关]

SC0121_串口波特率自动检测

[复制链接]
1262|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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,表示自动波特率检测成功


SC0121_USART_Software_Auto_Baud_Rate_Detection_ZH_V2.0.0.pdf (608.35 KB) SC0121_SourceCode_V2.0.0.zip (590.76 KB)

使用特权

评论回复
沙发
lajfda001| | 2023-11-2 08:56 | 只看该作者
自动识别串口波特率吗?

使用特权

评论回复
板凳
lihuami| | 2023-12-3 22:45 | 只看该作者
需要预先设定校验数据,而且对于不同长度的数据,需要分别设定校验数据,实现起来比较繁琐。

使用特权

评论回复
地板
yeates333| | 2023-12-4 10:50 | 只看该作者
测量到两个上升沿间的时间,除以8就可以得到一位的时间,求个倒数就是波特率了。

使用特权

评论回复
5
modesty3jonah| | 2023-12-4 11:42 | 只看该作者
如果接收到的数据与发送的数据一致,则说明波特率正确,否则就需要调整波特率。这种方法的优点是可以自动适应不同的波特率,但是缺点是需要精确地控制延时时间,实现起来比较复杂。

使用特权

评论回复
6
mollylawrence| | 2023-12-4 14:41 | 只看该作者
硬件自动检测方法根据检测波特率方式的不同,ABR又分为4种模式。

使用特权

评论回复
7
iyoum| | 2023-12-4 15:32 | 只看该作者
在单片机端口接收到字符后,根据接收到的起始位和结束位以及字符的长度,计算接收到的实际波特率

使用特权

评论回复
8
jackcat| | 2023-12-5 10:27 | 只看该作者
单片机的串口波特率自动检测功能,通常被称为ABR

使用特权

评论回复
9
adolphcocker| | 2023-12-5 10:54 | 只看该作者
软件检测方法适用于所有单片机,通过把RX引脚设置为输入捕获模式,让对方发送一个字节的数据(最好是0x7F),通过测量边缘时间来计算波特率

使用特权

评论回复
10
vivilyly| | 2023-12-5 12:02 | 只看该作者
如果差异在允许的范围内(例如5%),则认为接收到的波特率是正确的。否则,说明接收到的波特率存在误差。

使用特权

评论回复
11
jkl21| | 2023-12-5 14:44 | 只看该作者
在接收到一定数量的数据后,可以通过计算接收到的数据的时间和数据量来推算出当前的波特率,并与预设的波特率范围进行比较,以确定当前的波特率是否在预设的范围内。

使用特权

评论回复
12
juliestephen| | 2023-12-5 15:05 | 只看该作者
虽然串口自动波特率检测功能非常实用,但在某些情况下可能会出现误判的情况

使用特权

评论回复
13
51xlf| | 2023-12-5 15:28 | 只看该作者
发送数据时,根据波特率设定一个合理的延时时间,然后在接收端等待相同的时间后再开始接收数据

使用特权

评论回复
14
mmbs| | 2023-12-5 15:47 | 只看该作者
串口波特率自动检测需要一定的时间和计算资源,可能会影响到单片机的性能和稳定性。

使用特权

评论回复
15
maudlu| | 2023-12-5 17:37 | 只看该作者
采用时间测量法或特征值匹配法进行波特率检测。

使用特权

评论回复
16
i1mcu| | 2023-12-5 20:07 | 只看该作者
自动波特率检测功能内置了各种模式用于不同字符的检测

使用特权

评论回复
17
hjl2832| | 2023-12-6 08:16 | 只看该作者
波特率容易计算,怎么计算出校验位和数据位才是关键。

使用特权

评论回复
18
caigang13| | 2023-12-6 11:10 | 只看该作者
波特率自适应就是识别脉冲宽度

使用特权

评论回复
19
jackcat| | 2023-12-6 15:24 | 只看该作者
上位机接收到单片机的请求后,会以一定的波特率发送回车符(0x0D)给单片机。

使用特权

评论回复
20
pentruman| | 2023-12-6 16:20 | 只看该作者
单片机接收到上位机的回车符后,开始计算上位机的波特率。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

178

主题

266

帖子

8

粉丝