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
相关产品推荐
相关产品推荐

