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

STM32 HAL库下无法通过UART发送ADC值至串口,求问题排查

问题:ADC采集值无法通过UART发送至串口

我需要将ADC采集的值发送到NodeMCU并展示在Web UI中,但目前无法通过UART向串口发送任何数据。已确认ADC值读取正常,但UART发送无输出,请求排查问题。

已编写的代码:

1. 头文件与变量定义

#include "stdio.h"
#include "string.h"

uint8_t convEnd = 0;
uint32_t adcBuff[3];        
uint32_t adcData[3];

2. ADC转换完成回调函数(DMA方式)

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{   
    if (hadc->Instance == ADC1) {
        adcData[0] = adcBuff[0];
        adcData[1] = adcBuff[1];
        adcData[2] = adcBuff[2];
        convEnd = 1; 
    }     
}

3. 主循环逻辑

while (1) {
    if (convEnd == 1) {       // 检查转换是否完成
        char txt[30];

        sprintf(txt, "ADC Val: %d %d\n\r", adcData[0], adcData[1]);           
        HAL_UART_Transmit(&huart2, (uint8_t *)txt, strlen(txt), 100);     
        HAL_Delay(500);                               
        convEnd = 0;
    }
}

排查步骤:

  • 硬件连接检查:确认UART2的TX引脚是否正确连接到接收端(串口工具/NodeMCU的RX引脚),引脚电平兼容(3.3V/5V),接线无松动。
  • UART配置校验:核对UART2的初始化参数(波特率、数据位、停止位、奇偶校验)与接收端完全一致,确保huart2结构体初始化正确,对应时钟已使能。
  • 捕获发送返回状态:修改代码获取HAL_UART_Transmit的返回值,判断发送是否失败:
    HAL_StatusTypeDef status = HAL_UART_Transmit(&huart2, (uint8_t *)txt, strlen(txt), 100);
    if (status != HAL_OK) {
        // 可通过LED闪烁等方式标记发送异常
    }
    
  • 中断优先级检查:确认ADC DMA中断优先级未抢占UART资源,避免发送被阻塞。
  • 串口工具设置:确保串口工具的端口、波特率与配置一致,流控设置为“无”。
  • 变量原子性修正:给convEnd添加volatile关键字,防止编译器优化导致主循环无法检测到标志位变化:
    volatile uint8_t convEnd = 0;
    
  • 基础UART功能测试:暂时屏蔽ADC相关逻辑,在主循环中直接发送固定字符串,验证UART本身是否正常工作:
    while (1) {
        char test_str[] = "UART Test\r\n";
        HAL_UART_Transmit(&huart2, (uint8_t*)test_str, strlen(test_str), 100);
        HAL_Delay(1000);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:07:42