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

如何为串口设备传感器的阈值判断添加200ms持续时长条件?

解决串口传感器状态持续时间判断的问题

嘿,这个需求太常见了——很多场景下都得避免瞬间波动触发误操作,咱们一步步来实现这个200ms的延迟判断逻辑。

首先,你需要在你的类里添加几个成员变量,用来记录状态变化的时间点和当前的状态:

// 在类的头文件或者.cpp的类成员定义里添加
double lastStateChangeTime = 0.0; // 记录上次状态切换的时间(秒)
bool isAboveThreshold = false;    // 标记当前是否处于超过阈值的状态
const double requiredDuration = 0.2; // 需要持续的时间,200ms转换成秒

接下来,把你原来的if-else逻辑替换成下面的判断逻辑。核心思路是只有当超过阈值的状态持续满200ms时,才触发样式切换;如果中途状态回落,立刻重置计时并恢复初始样式:

// 假设你每次获取到y_acc和当前的key(程序启动流逝时间,秒)后执行这段代码
bool currentIsAbove = (y_acc > accThreshold);

if (currentIsAbove) {
    if (!isAboveThreshold) {
        // 刚进入"超过阈值"的状态,记录当前时间点
        lastStateChangeTime = key;
        isAboveThreshold = true;
        // 先隐藏按钮,等满足时间条件再显示
        ui->rdo_btn->hide();
    } else {
        // 已经处于超过状态,检查是否持续了足够时间
        double elapsedTime = key - lastStateChangeTime;
        if (elapsedTime >= requiredDuration) {
            // 满足200ms持续条件,触发样式和显示按钮
            ui->rdo_btn->show();
            setStyleSheet(StyleSheetOn);
        }
    }
} else {
    if (isAboveThreshold) {
        // 从"超过阈值"状态回落,不管有没有到时间,都恢复初始状态
        isAboveThreshold = false;
        setStyleSheet(StyleSheetOff);
        ui->rdo_btn->hide();
    }
    // 本来就低于阈值,无需额外操作
}

逻辑解释:

  • 当第一次检测到y_acc超过阈值时,只记录当前时间,不立刻切换样式——避免瞬间波动触发误操作。
  • 后续每次检测时,如果状态依然是超过阈值,就计算从记录时间到现在的流逝时间,当时间≥200ms时,才执行样式切换和按钮显示。
  • 一旦检测到y_acc低于阈值,立刻重置状态,恢复到StyleSheetOff的样式,不管之前是否达到了200ms的条件。

注意事项:

  • 确保key是带小数精度的秒数(比如精确到毫秒,像12.345这样),如果你的key是整数秒的话,可能需要改用更精确的时间获取方式,不然200ms的判断会不准确。
  • 把那几个成员变量放在类的成员里,不要放在局部函数中,否则每次调用都会重置状态,无法记录持续时间。

如果需要调整逻辑(比如回落时也需要延迟恢复样式),可以再基于这个框架修改~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:52:49