STM32F103CBT6使用轮询方式通过UART接收距离传感器数据失败
问题分析与解决方案
核心问题排查
- HAL_UART_Receive参数误用
你用strlen(RxBuff)作为接收字节数,但未初始化的RxBuff内存是随机值,strlen会返回不可预测的长度,直接导致接收逻辑混乱。HAL_UART_Receive的第三个参数是固定的待接收字节数,不是字符串长度。 - 数组定义不规范
代码里char txBuffer[txBuff];和char RxBuff[RxBuff_size];中的txBuff、RxBuff_size如果没有提前用#define定义为具体数值(比如#define RxBuff_size 32),编译器会生成异常大小的数组,引发数据存储错误。 - 字符串终止符缺失
即使接收成功,RxBuff如果没有手动添加'\0'终止符,sprintf处理时会读取内存垃圾数据,甚至触发越界。
修正后的代码示例
// 提前定义数组大小宏,根据传感器输出长度调整 #define RxBuff_SIZE 16 #define TxBuff_SIZE 64 char txBuffer[TxBuff_SIZE]; char RxBuff[RxBuff_SIZE]; while (1) { // 假设传感器每次固定输出5字节数据(需对照传感器手册调整) HAL_StatusTypeDef status = HAL_UART_Receive(&huart1, (uint8_t*)RxBuff, 5, 1000); if (status == HAL_OK) { // 添加字符串终止符,确保sprintf正常解析 RxBuff[5] = '\0'; sprintf(txBuffer, "distance: %s\n", RxBuff); HAL_UART_Transmit(&huart1, (uint8_t *)txBuffer, strlen(txBuffer), HAL_MAX_DELAY); } else if (status == HAL_TIMEOUT) { sprintf(txBuffer, "Receive timeout\n"); HAL_UART_Transmit(&huart1, (uint8_t *)txBuffer, strlen(txBuffer), HAL_MAX_DELAY); } HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(100); }
额外检查项
- UART配置对齐:确认STM32的波特率、数据位、停止位、奇偶校验和传感器完全一致(参考Arduino上的工作配置)。
- 硬件接线验证:检查TX/RX交叉连接(STM32 RX接传感器TX,STM32 TX接传感器RX),确保GND共地。
- 不定长数据处理:如果传感器输出是可变长度数据,建议改用
HAL_UART_Receive_IT中断接收方式,避免阻塞主循环,同时能正确处理动态数据长度。
内容的提问来源于stack exchange,提问作者Maip N.
相关产品推荐
相关产品推荐

