打印
[MM32硬件]

实现UART硬件波特率自适应功能

[复制链接]
760|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢动作|  楼主 | 2024-3-25 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实现UART硬件波特率自适应功能,以便在上位机和MCU端的波特率不匹配时能够自动识别并切换到正确的波特率,以确保正常通信。

下面是一个基本的实现思路:

MCU端初始化UART1,并配置为非标准波特率9200。
启用UART1的空闲中断,以便在接收到上位机数据后触发中断。
在空闲中断服务程序中实现波特率自适应功能。
当接收到上位机的数据后,检测首个通信字节的位宽,并确定前一个边沿和后一个边沿之间的位长。
根据检测到的位宽和位长来识别上位机的波特率。
使用识别出的波特率重新配置UART1的波特率,以确保后续通信的正常进行。

使用特权

评论回复
沙发
慢动作|  楼主 | 2024-3-25 10:35 | 只看该作者
以下是一个伪代码示例,用于说明如何实现这一功能:
// 初始化UART1
UART1_Init(9200);

// 启用UART1空闲中断
UART1_EnableIdleInterrupt();

// UART1空闲中断服务程序
void UART1_IdleInterruptHandler() {
    // 等待接收到第一个字节
    while (!UART1_ReceivedByteAvailable());

    // 读取第一个字节
    uint8_t first_byte = UART1_ReadByte();

    // 检测位宽和位长

    // 根据检测结果识别波特率
    uint32_t detected_baudrate = DetectBaudrate(first_byte, edge_width, bit_length);

    // 重新配置UART1波特率
    UART1_ConfigureBaudrate(detected_baudrate);
}

// 检测波特率函数
uint32_t DetectBaudrate(uint8_t first_byte, uint8_t edge_width, uint8_t bit_length) {
    // 根据首字节的位宽和位长来识别波特率
    // 这里可能需要根据您的具体需求和应用场景进行更详细的检测和识别
    // 返回识别出的波特率
}

使用特权

评论回复
板凳
慢动作|  楼主 | 2024-3-25 10:35 | 只看该作者
需要根据具体MCU型号和开发环境来实现这些功能,并根据需要进行适当的修改和调整。另外可能需要根据应用场景和要求对波特率检测算法进行进一步优化和调整。

使用特权

评论回复
地板
chenqianqian| | 2024-3-25 21:40 | 只看该作者
那且不是会丢失数据?

使用特权

评论回复
5
g0d5xs| | 2024-4-27 13:42 | 只看该作者
自适应的话,其实最初发AT或者一些标识符就好了,对应上才使用

使用特权

评论回复
6
g0d5xs| | 2024-4-27 15:02 | 只看该作者
确定UART通信所需的波特率范围。根据应用需求和通信环境,确定最低和最高波特率

使用特权

评论回复
7
y1n9an| | 2024-4-27 16:07 | 只看该作者
根据MCU的技术手册和UART模块的配置寄存器,设置波特率寄存器的初始值

使用特权

评论回复
8
p0gon9y| | 2024-4-27 17:14 | 只看该作者
建议将初始波特率设置为范围内的一个中间值,以便在自适应过程中进行调整

使用特权

评论回复
9
q1d0mnx| | 2024-4-27 18:19 | 只看该作者
在通信开始之前,通过发送和接收一些特定的测试数据,来评估通信质量。可以使用校验位、奇偶校验、CRC等方法来检测数据的正确性

使用特权

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

本版积分规则

55

主题

517

帖子

0

粉丝