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

