首页 > 解决方案 > 为什么blinkLED说它正在超时

问题描述

我很难多次调用以下函数。当我这样做时,我相信我遇到了计时错误,我似乎无法找到另一种方法来编写此代码以在给定命令时执行 Raspberry Pi 的 GPIO 引脚。它主要是从示例中提取的,我将其包装起来。任何帮助表示赞赏。该函数在另一个文件中调用。

编码:

const GPIO = require('onoff').Gpio
const LED = new GPIO(9, 'out')


function call(){
const blinkInterval = setInterval(blinkLED, 2500);

function blinkLED() { //function to start blinking
  if (LED.readSync() === 0) { //check the pin state, if the state is 0 (or off)
    LED.writeSync(1); //set pin state to 1 (turn LED on)
  } else {
    LED.writeSync(0); //set pin state to 0 (turn LED off)
  }
}

function endBlink() { //function to stop blinking
  clearInterval(blinkInterval); // Stop blink intervals
  LED.writeSync(0); // Turn LED off
  LED.unexport(); // Unexport GPIO to free resources
}

setTimeout(endBlink, 5000);

错误:

internal/fs/utils.js:298
    throw err;
    ^

Error: EBADF: bad file descriptor, read
    at Object.readSync (fs.js:581:3)
    at Gpio.readSync (/home/pi/Documents/project/node_modules/onoff/onoff.js:214:8)
    at Timeout.blinkLED [as _onTimeout] (/home/pi/Documents/project/shot.js:10:11)
    at listOnTimeout (internal/timers.js:551:17)
    at processTimers (internal/timers.js:494:7) {
  errno: -9,
  syscall: 'read',
  code: 'EBADF'
}

标签: javascripteventsraspberry-pievent-handlingsetinterval

解决方案


由于没有人回答,我想我已经为任何偶然发现这一点的人弄清楚了。

为了多次重复使用相同的引脚,您不需要根据开关 NPM 包取消导出它们。所以没有 LED.unexport(); 该程序每次都能完美运行。


推荐阅读