首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >USART 流控制参数:原理、配置与应用(建议收藏备用!!!)

USART 流控制参数:原理、配置与应用(建议收藏备用!!!)

作者头像
紫昭
发布2025-11-29 08:47:43
发布2025-11-29 08:47:43
3190
举报

引言

在嵌入式系统开发中,USART(通用同步异步收发传输器)作为一种常用的串行通信接口,能实现设备间稳定的数据传输。而流控制是确保数据传输可靠性的关键机制,它能有效避免数据丢失,保证通信的准确性。本文将深入探讨基于 STM32 的 USART 流控制参数的使用,涵盖硬件流控制和软件流控制两方面。

硬件流控制(RTS/CTS)

原理

硬件流控制通过 RTS(请求发送)和 CTS(清除发送)两个硬件信号引脚来协调数据传输。发送方依据 CTS 引脚电平判断接收方是否准备就绪,接收方则通过控制 RTS 引脚电平告知发送方能否发送数据。这种方式实时性强,能快速响应传输状态变化。

基于 STM32 的配置示例
代码语言:javascript
复制
#include "stm32f4xx_hal.h"

UART_HandleTypeDef huart1;

// 初始化 USART1 并配置硬件流控制
void USART1_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;

    if (HAL_UART_Init(&huart1)!= HAL_OK) {
        // 初始化错误处理
        Error_Handler();
    }
}

// 发送数据函数
void USART1_SendData(uint8_t *pData, uint16_t Size) {
    HAL_UART_Transmit(&huart1, pData, Size, HAL_MAX_DELAY);
}

// 接收数据函数
void USART1_ReceiveData(uint8_t *pData, uint16_t Size) {
    HAL_UART_Receive(&huart1, pData, Size, HAL_MAX_DELAY);
}
代码解析

在上述代码中,先定义了 UART_HandleTypeDef 类型的 huart1 结构体。在 USART1_Init 函数里,对 huart1 进行初始化配置,将 HwFlowCtl 设置为 UART_HWCONTROL_RTS_CTS 以启用硬件流控制。接着调用 HAL_UART_Init 初始化 USART1。发送和接收数据分别通过 HAL_UART_Transmit 和 HAL_UART_Receive 函数实现。

软件流控制(XON/XOFF)

原理

软件流控制依靠在数据流中插入特定字符实现。XON(DC1,ASCII 码 17)表示接收方准备好接收数据,XOFF(DC3,ASCII 码 19)表示接收方忙,需发送方暂停发送。这种方式无需额外硬件引脚,灵活性高,但实时性稍逊于硬件流控制。

基于 STM32 的配置示例
代码语言:javascript
复制
#include "stm32f4xx_hal.h"

UART_HandleTypeDef huart1;
bool xoff_received = false;

// 初始化 USART1 并配置软件流控制
void USART1_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;

    if (HAL_UART_Init(&huart1)!= HAL_OK) {
        // 初始化错误处理
        Error_Handler();
    }
}

// 发送数据函数
void USART1_SendData(uint8_t *pData, uint16_t Size) {
    while (xoff_received);
    HAL_UART_Transmit(&huart1, pData, Size, HAL_MAX_DELAY);
}

// 接收数据回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart == &huart1) {
        uint8_t receivedByte;
        HAL_UART_Receive(&huart1, &receivedByte, 1, HAL_MAX_DELAY);
        if (receivedByte == 19) {
            xoff_received = true;
        }
        else if (receivedByte == 17) {
            xoff_received = false;
        }
        // 处理其他接收到的数据
    }
}
代码解析

代码中,先定义 huart1 结构体和 xoff_received 标志位。在 USART1_Init 函数中,将 HwFlowCtl 设置为 UART_HWCONTROL_NONE 禁用硬件流控制。发送数据时,通过 while (xoff_received) 等待直到 xoff_received 为 false。在接收回调函数 HAL_UART_RxCpltCallback 中,检测接收到的字符是否为 XON 或 XOFF,并相应设置 xoff_received 标志位。

注意事项

  1. 硬件连接:使用硬件流控制时,务必确保 RTS 和 CTS 引脚与对方设备正确连接,且电平匹配。不同设备的电平标准可能不同,需特别留意。
  2. 软件处理:在软件流控制中,要精准处理 XON 和 XOFF 字符的接收与发送逻辑。避免因数据干扰导致误判,影响数据传输稳定性。
  3. 数据传输速率:流控制参数的设置会影响数据传输速率。过高的波特率可能导致数据丢失,应根据实际需求和设备性能合理调整。
  4. 兼容性:不同 STM32 型号对 USART 流控制的支持和实现方式可能有差异。开发前需查阅对应芯片手册,确保配置正确。

结论

USART 流控制参数的合理运用是实现可靠串行通信的关键。硬件流控制实时性强,适合高速、对实时性要求高的场景;软件流控制灵活性高,适用于硬件资源有限的情况。在实际开发中,需根据具体需求权衡选择,精心配置参数,确保通信稳定高效。

“学如逆水行舟,不进则退。”愿此篇文章成为你在技术之舟上的有力浆橹。有任何感悟或困惑,可于评论区交流探讨。若觉有益,点赞,收藏不妨一试,也期待你关注我。在技术的漫漫征途中,愿与君相伴而行,共赏知识繁花盛景,同历成长蜕变之喜。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 硬件流控制(RTS/CTS)
    • 原理
    • 基于 STM32 的配置示例
    • 代码解析
  • 软件流控制(XON/XOFF)
    • 原理
    • 基于 STM32 的配置示例
    • 代码解析
  • 注意事项
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档