在嵌入式系统开发中,USART(通用同步异步收发传输器)作为一种常用的串行通信接口,能实现设备间稳定的数据传输。而流控制是确保数据传输可靠性的关键机制,它能有效避免数据丢失,保证通信的准确性。本文将深入探讨基于 STM32 的 USART 流控制参数的使用,涵盖硬件流控制和软件流控制两方面。
硬件流控制通过 RTS(请求发送)和 CTS(清除发送)两个硬件信号引脚来协调数据传输。发送方依据 CTS 引脚电平判断接收方是否准备就绪,接收方则通过控制 RTS 引脚电平告知发送方能否发送数据。这种方式实时性强,能快速响应传输状态变化。
#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(DC1,ASCII 码 17)表示接收方准备好接收数据,XOFF(DC3,ASCII 码 19)表示接收方忙,需发送方暂停发送。这种方式无需额外硬件引脚,灵活性高,但实时性稍逊于硬件流控制。
#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 标志位。
USART 流控制参数的合理运用是实现可靠串行通信的关键。硬件流控制实时性强,适合高速、对实时性要求高的场景;软件流控制灵活性高,适用于硬件资源有限的情况。在实际开发中,需根据具体需求权衡选择,精心配置参数,确保通信稳定高效。
“学如逆水行舟,不进则退。”愿此篇文章成为你在技术之舟上的有力浆橹。有任何感悟或困惑,可于评论区交流探讨。若觉有益,点赞,收藏不妨一试,也期待你关注我。在技术的漫漫征途中,愿与君相伴而行,共赏知识繁花盛景,同历成长蜕变之喜。