嵌入式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](数组元素的值),而非该元素的地址。这导致函数无法将后续接收的字节写入数组,只有第一次调用时可能意外写入了某个位置,后续循环无法正确存储数据,最终仅能处理第一个数字。
修正方案
- 修正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; } } - 初始化intValue:每次接收新的位置值前,将
intValue清零,避免之前的计算结果影响当前值。 - 检查接收返回值:添加
HAL_UART_Receive的返回值判断,处理接收超时或错误的情况,避免无效数据参与计算。
额外注意事项
- 确保
NUM_DIGITS的定义与实际需要接收的数字位数一致(比如4位就设为4)。 - 确认UART的波特率、数据位、停止位等配置与发送端一致,避免通信格式不匹配导致接收失败。
- 如果用户输入是以换行符或其他结束符结尾,也可以改为按结束符接收整串数据后再转换,能更灵活处理不同长度的输入。
内容的提问来源于stack exchange,提问作者moon
相关产品推荐
相关产品推荐

