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
相关产品推荐
相关产品推荐

