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

嵌入式C中UART接收用户输入异常:AS5600编码器直流电机位置控制问题

问题与解决:UART接收多位数仅存储首位的问题

问题场景

使用AS5600编码器实现直流电机位置控制时,通过UART获取用户输入的4位位置值(如1222),但缓冲区数组仅存储了'1'的ASCII值,后续数字未被正确存储。尝试用二维数组循环接收并转换为十进制的代码如下:

for (int j = 0; j < NUM_DIGITS; j++)
{
  HAL_UART_Receive(&huart2, rxBuffer[i][j], 1, 1000);
  intValue = (intValue * 10) + (rxBuffer[i][j] - '0');
}

问题根源

HAL_UART_Receive函数的第二个参数要求传入存储接收数据的内存地址,但代码中直接传入了rxBuffer[i][j](数组元素的值),而非该元素的地址。这导致函数无法将后续接收的字节写入数组,只有第一次调用时可能意外写入了某个位置,后续循环无法正确存储数据,最终仅能处理第一个数字。

修正方案

  1. 修正UART接收的参数传递:将rxBuffer[i][j]改为&rxBuffer[i][j],传递数组元素的地址,确保接收的数据能正确写入缓冲区:
    // 初始化intValue,避免累积旧值
    intValue = 0;
    for (int j = 0; j < NUM_DIGITS; j++)
    {
      // 检查接收是否成功,确保数据有效
      if (HAL_UART_Receive(&huart2, &rxBuffer[i][j], 1, 1000) == HAL_OK)
      {
        intValue = (intValue * 10) + (rxBuffer[i][j] - '0');
      }
      else
      {
        // 接收超时或出错的处理逻辑,比如重置或提示
        intValue = -1;
        break;
      }
    }
    
  2. 初始化intValue:每次接收新的位置值前,将intValue清零,避免之前的计算结果影响当前值。
  3. 检查接收返回值:添加HAL_UART_Receive的返回值判断,处理接收超时或错误的情况,避免无效数据参与计算。

额外注意事项

  • 确保NUM_DIGITS的定义与实际需要接收的数字位数一致(比如4位就设为4)。
  • 确认UART的波特率、数据位、停止位等配置与发送端一致,避免通信格式不匹配导致接收失败。
  • 如果用户输入是以换行符或其他结束符结尾,也可以改为按结束符接收整串数据后再转换,能更灵活处理不同长度的输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:22:26