基于Boolean变量与if-else处理传感器实时流时b值无理由异常多增排查
核心问题根因
原来的实现存在两个致命逻辑漏洞,直接导致运行后b值随机跳涨:
- 完全缺失对序列中两个3.5特征值的校验逻辑
代码最外层只在收到3.9时才进入计数逻辑,碰到序列内的3.5数值时,既不推进状态机流程,也不清零之前累计的3.9计数。最终的计数是跨分段累加的:把开头3个3.9、中间10个3.9、末尾11个3.9的数值凑起来总共24个3.9,你设置的22阈值会在累计到22个的时候就触发b++,根本不需要等完整的序列走完。 - 没有实现错位重置机制
当收到的数据流和序列开头不对齐时(比如第二次启动应用时,传感器推送的流是从序列中间的某段3.9开始的),残留的旧计数值不会被清零,只要后续推送的3.9累计够22个,就会误触发b++,这就是第二次启动时b值无理由上涨3-4次的直接原因。
符合约束的修正方案
严格遵守「仅使用Boolean变量+if-else判断、不引入循环逻辑」的边界要求,把序列的关键特征节点作为状态切换的锚点,碰到不符合当前状态预期的数值时,立刻清零所有计数、状态回到初始等待序列头的位置:
- 用独立Boolean标记记录当前等待的节点:是在等头段3.9、等第一个3.5、等中间段3.9、等第二个3.5、还是等尾段3.9
- 每个节点严格按序列要求计数,不跨节点累加数值
- 任何不符合当前节点预期的数值出现时,直接重置所有状态,从下一个新的序列头开始匹配
修正后的参考代码:
// 所有状态变量均为Boolean或整型计数器,无循环依赖 var head39Count = 0 var waitFirst35 = false var mid39Count = 0 var waitSecond35 = false var tail39Count = 0 // 每次收到传感器实时值x1时执行以下逻辑 // 初始状态:等待序列开头的连续3个3.9 if (!waitFirst35 && !waitSecond35) { if (x1 == 3.9) { head39Count++ if (head39Count == 3) { head39Count = 0 waitFirst35 = true } } else { // 收到非3.9的异常值,直接重置所有状态 head39Count = 0 mid39Count = 0 tail39Count = 0 waitFirst35 = false waitSecond35 = false } } // 等待第一个3.5特征值 else if (waitFirst35 && !waitSecond35) { if (x1 == 3.5) { waitFirst35 = false // 进入中间段10个3.9的计数 mid39Count++ if (mid39Count == 10) { mid39Count = 0 waitSecond35 = true } } else { // 没等到3.5就收到其他值,说明序列错位,直接重置所有状态 waitFirst35 = false mid39Count = 0 } } // 等待第二个3.5特征值 else if (waitSecond35) { if (x1 == 3.5) { waitSecond35 = false // 进入尾段11个3.9的计数 tail39Count++ if (tail39Count == 11) { tail39Count = 0 b++ // 完整匹配一次序列后,所有状态自动回到初始等待头段的状态 } } else { // 没等到3.5就收到其他值,说明序列错位,直接重置所有状态 waitSecond35 = false tail39Count = 0 } }
修正后效果
- 完全校验序列内两个3.5的关键特征位,不会因为跨分段累计3.9的数量就误触发
b++ - 数据流起始位置和序列不对齐时,会自动识别错位并从下一个合法序列头重新开始匹配,不会出现无理由跳涨的情况
- 全程仅使用Boolean状态标记和独立if-else分支判断,没有引入循环逻辑,适配传感器实时数据流的场景
内容的提问来源于stack exchange,提问作者Satyam Raikwar
相关产品推荐
相关产品推荐

