You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HAL_UART_Receive函数无法正确向rxData[]写入数据的问题

UART接收4位数据后再次接收出现数组内容异常问题

问题详情

使用STM32 HAL库的HAL_UART_Receive函数接收串口监视器发送的4位数字:

  • 首次发送1234时,rxData数组存储正常;
  • 再次发送新数字1465时,数组内容出现异常;
  • 复位设备后问题仍存在。

核心代码如下:

uint8_t rxData[10];

while (1)
{
    /* USER CODE END WHILE */
    HAL_UART_Receive(&huart2, rxData, 4, HAL_MAX_DELAY);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, SET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, RESET);
    HAL_UART_Transmit(&huart2, rxData, 4,1000);
    /* USER CODE BEGIN 3 */
}

排查与解决方案

1. 清除串口错误标志

串口接收过程中若出现溢出、帧错误等异常,残留的错误标志会干扰后续接收,每次接收前清除相关标志:

// 在HAL_UART_Receive调用前添加
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_ORE | UART_FLAG_NE | UART_FLAG_FE | UART_FLAG_PE);
HAL_UART_Receive(&huart2, rxData, 4, HAL_MAX_DELAY);

2. 显式初始化接收数组

全局数组默认初始化为0,但显式初始化可避免未知随机值干扰(若数组为局部变量则更必要):

uint8_t rxData[10] = {0}; // 显式初始化所有元素为0

3. 校验串口配置一致性

确认串口监视器与代码中UART配置的波特率、数据位、停止位、奇偶校验完全一致,任何参数不匹配都会导致接收数据异常。

4. 检查接收状态并处理错误

添加接收状态检查,若接收失败则清除错误标志后重试:

HAL_StatusTypeDef rxStatus;
do {
    __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_ORE);
    rxStatus = HAL_UART_Receive(&huart2, rxData, 4, HAL_MAX_DELAY);
} while (rxStatus != HAL_OK);

5. 排查硬件连接问题

  • 确认串口TX/RX引脚连接正确,无接反;
  • 检查串口线是否松动,尝试更换屏蔽线减少电磁干扰;
  • 测试目标板供电是否稳定,电压波动可能影响UART通信。

内容的提问来源于stack exchange,提问作者Theja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:35:06