NodeJS实现函数节流:Arduino串口信号5秒触发一次sound函数
解决NodeJS监听Arduino串口按钮重复触发的问题
这问题我太熟了!Arduino的按钮如果没做消抖处理,按下时会因为机械触点的抖动产生一堆电平变化,串口自然就会收到连续的信号。咱们可以在NodeJS代码里加个节流控制,让sound()函数每5秒最多执行一次,不管中间收到多少串口信号。
修改后的代码示例
// 定义变量记录上次执行sound()的时间,初始值设为0确保第一次能触发 let lastSoundTime = 0; serialport.on("open", function() { console.log("Serial Port Opened"); serialport.on("data", function(data) { const currentTime = Date.now(); // 两个判断条件:1. 按钮信号触发(data[0]为真);2. 距离上次执行已过至少5秒 if (data[0] && (currentTime - lastSoundTime >= 5000)) { sound(); // 更新上次执行时间为当前时间,开启冷却 lastSoundTime = currentTime; } }); }); function sound() { // 你的播放声音逻辑... }
代码逻辑解释
lastSoundTime:用来追踪上一次调用sound()的时间戳,初始值0保证第一次收到按钮信号时能直接触发函数。- 每次收到串口数据时,先获取当前时间,然后检查两个条件:
- 确认是按钮触发的有效信号(
data[0]为真); - 距离上次执行
sound()已经过去了5000毫秒(5秒)。
- 确认是按钮触发的有效信号(
- 只有同时满足两个条件时,才会执行
sound(),并更新lastSoundTime的时间戳,这样接下来5秒内的所有串口信号都会被过滤掉。
额外建议
如果条件允许,最好在Arduino端也做硬件消抖(加个100nF的电容并联在按钮两端)或者软件消抖(比如用delay()或者判断电平稳定时间),从源头减少重复信号的发送,这样NodeJS这边的处理压力也会更小~
内容的提问来源于stack exchange,提问作者Santiago D'Antuoni
相关产品推荐
相关产品推荐

