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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:52:36