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

STM32 Nucleo板与Explorir-M-20 CO2传感器的UART通信故障

测量CO₂浓度时STM32无法正常接收传感器数据问题

我尝试测量CO₂浓度(单位ppm),但无法从传感器接收数据。使用的传感器为Explorir-M-20(带数据手册),采用UART通信协议;开发板为STM32 Nucleo L6A6ZG,使用PD9(RX)和PD8(TX)引脚,通信参数为波特率9600 Bits/s、字长8位、1个停止位。

我先后尝试了轮询模式和中断模式的UART通信,均未成功:RxBuffer始终为0,HAL状态始终显示OK,无任何错误提示。轮询模式代码如下:

HAL_StatusTypeDef ret_uart;
uint8_t buf_uart[12];
uint8_t TxBuffer[5]="Z\r\n";
uint8_t RxBuffer[9] = {0};
uint8_t co2[3] = {0};
int co2_ppm = 0;

int readCO2(void){
    ret_uart = HAL_UART_Transmit(&huart3, (uint8_t *)TxBuffer, sizeof(TxBuffer),100);
    if (ret_uart != HAL_OK){
        strcpy((char*)buf_uart, "Error Tx\r\n");
    }
    else{
        HAL_Delay(4000);
        ret_uart = HAL_UART_Receive(&huart3, (uint8_t *)RxBuffer, sizeof(RxBuffer),100);
        if (ret_uart != HAL_OK){
            strcpy((char*)buf_uart, "Error Rx\r\n");
        }
        else{
            co2[0] = RxBuffer[5] - '0';
            co2[1] = RxBuffer[6] - '0';
            co2[2] = RxBuffer[7] - '0';
            co2_ppm = (1000 * co2[0]) + (100 * co2[1]) + (10*co2[2]);
        }
    }
}

用协议分析仪检测后发现:传感器收到Z\r\n(测量请求命令)后会立即发送测量数据,但STM32板无法记录该数据。


更新1

我按照建议,移除了4秒延迟,并将TxBuffer的大小从5字节改为3字节(最初设为5字节是因为误算引号长度)。同时改为中断模式接收UART数据,并添加了K 2\r\n命令,将传感器设置为轮询模式,使其在后台持续测量、按需输出数据。相关代码片段:

ret_uart = HAL_UART_Transmit(&huart3, (uint8_t *)TxBuffer, sizeof(TxBuffer),100);
HAL_Delay(100);
ret_uart = HAL_UART_Transmit(&huart3, (uint8_t *)Kmode, sizeof(Kmode),100);

现在系统可部分工作,但出现新问题:首次测量后,RxBuffer中的数值不再更新,始终保持同一值,而协议分析仪显示传感器已发送新的测量数据。我已设置存储所有测量值的缓冲区,但仍无法获取新数据,请问该如何解决?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:27:48