Mbed OS 5 C++编程:如何实现num>0.5时仅触发一次处理函数
解决方案
问题的核心是你当前的代码会在while循环的每次迭代中,只要num > 0.5就重复调用rise_handler()。要实现仅在状态切换时触发一次(也就是当num从≤0.5变为>0.5的瞬间),我们需要添加一个状态变量来跟踪上一次的检测结果,避免重复触发。
修改思路
- 新增一个布尔变量记录上一次的状态(比如
prev_above_threshold),初始值设为false(默认初始时num低于阈值)。 - 在循环中先判断当前
num的状态,再和上一次的状态对比:- 只有当当前状态为高于阈值,且上一次状态为低于阈值时,才调用
rise_handler()。 - 同理,当当前状态为低于阈值,且上一次状态为高于阈值时,才调用
fall_handler()。
- 只有当当前状态为高于阈值,且上一次状态为低于阈值时,才调用
- 每次判断后更新状态变量,为下一次循环做准备。
修改后的完整代码
// 新增状态变量,跟踪上一次的阈值检测结果 bool prev_above_threshold = false; void rise_handler() { timer.start(); } void fall_handler() { timer.stop(); } void signal() { while(1) { // 先获取当前num的状态 bool current_above = num > 0.5; // 状态从低于切换到高于时,调用rise_handler一次 if (current_above && !prev_above_threshold) { rise_handler(); } // 状态从高于切换到低于时,调用fall_handler一次 else if (!current_above && prev_above_threshold) { fall_handler(); } // 更新上一次的状态,供下一次循环判断 prev_above_threshold = current_above; } }
原理说明
这个逻辑类似边缘检测:只对状态的"上升沿"(从低到高)或"下降沿"(从高到低)做出响应,而不是对持续的高/低状态重复响应。这样就完美解决了你需要rise_handler()仅被调用一次的需求——只有当num首次超过0.5的那个循环迭代才会触发,之后只要num保持高于0.5,就不会重复调用。
内容的提问来源于stack exchange,提问作者hui
相关产品推荐
相关产品推荐

