修复传感器脱落无法上报故障: 发送指令 nack 计入连续失败,DP22 故障码改为 1

拔掉 AHT20 时 measure_start 返回 addr nack,原先直接跳过本次采样、fail_cnt 不增加,
导致永远判不出故障。发送指令失败与读数失败统一记失败,连续 3 次后显示 --。
fault_code:传感器故障报 1,2 预留;温湿度比较异常只闪显示、不上报。
This commit is contained in:
2026-08-31 18:35:01 +08:00
parent e324ebd99b
commit 6e2ce733a6
5 changed files with 32 additions and 25 deletions
+20 -7
View File
@@ -2,8 +2,8 @@
* @file app_th.c
* @brief CBR3 温湿度采集实现
* @author cyWu <1917507415@qq.com>
* @date 2026.08.29
* @version V1.0.0首次发布
* @date 2026.08.31
* @version V1.1.0发令阶段 nack 也计入连续失败;fault_code 由上层映射为 1
******************************************************************************/
#include "app_th.h"
@@ -40,6 +40,19 @@ typedef struct {
static AppThCtx_t s_th;
/**
* @brief 记一次采样失败(发令 nack / 读数失败共用)
* @return 无
*/
static void th_on_fail(void)
{
if (s_th.fail_cnt < 0xFF) {
s_th.fail_cnt++;
}
s_th.last_ok = 0;
log_error("th sample fail %d\n", s_th.fail_cnt);
}
/**
* @brief 初始化温湿度模块
* @return 无
@@ -85,8 +98,10 @@ void app_th_poll(uint16_t dt)
if (bsp_aht20_measure_start() == 0) {
s_th.state = TH_ST_WAIT_DATA;
s_th.wait_t0 = timer_get_ms();
} else {
/* 发令阶段 addr nack(未插/脱落)也算一次采样失败,不能直接跳过 */
th_on_fail();
}
/* measure_start 非 0=通讯失败,跳过本次采样 */
}
} else if (s_th.state == TH_ST_WAIT_DATA) {
clr_wdt();
@@ -106,9 +121,7 @@ void app_th_poll(uint16_t dt)
log_info("th %d.%dC %d%%\n",
(int)(t / 10), (int)((t < 0) ? (-t % 10) : (t % 10)), h);
} else {
s_th.fail_cnt++;
s_th.last_ok = 0;
log_error("th sample fail %d\n", s_th.fail_cnt);
th_on_fail();
}
}
}
@@ -152,7 +165,7 @@ uint8_t app_th_get_fail_cnt(void)
/**
* @brief 传感器故障(连续失败 ≥ BOARD_TH_FAIL_MAX
* @return 1=故障(显示 --、fault_code=2),0=正常
* @return 1=故障(显示 --、fault_code=1),0=正常
*/
uint8_t app_th_is_fault(void)
{