gpio.read null尝试读取输入时为false

时间:2019-05-01 21:15:50

标签: node.js callback null raspberry-pi gpio

我一直在尝试从超声波传感器读取值。 我正在使用的代码

foreach (var number in TestList)
{
    if(!actionBlock.Post(number))
        actionBlock.Complete();
    try
    {
        await actionBlock.Completion;
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
        //actionBlock is now dead
        break;
    }
}

我写了类似的python代码,我得到了值,但在这里我得到了

    //callbacks; got from a previous post
var gpio_read = function (channel) {
  new Promise(resolve => {
    gpio.read(channel, function (error, result) {
      console.log('gpio.read', error, result);
      resolve(result);
    });
  });
}

//
var off = function () {
  gpio.write(trig, 0);
}
tank.getDistance = function () {
  var start, stop;
  gpio.write(trig, 0);
  gpio.write(trig, 1);
  setTimeout(off, 10);
  while (gpio_read(echo) === 0) {
    start = Date.now();
    console.log("nosig");
  }
  while (gpio_read(echo) === 1) {
    stop = Date.now();
    console.log("sig");
  }
  console.log(stop - start);
};

// pin setup
tank.initPins = function () {
  async.parallel([
    gpio.setup(p7, gpio.DIR_OUT),
    gpio.setup(p11, gpio.DIR_OUT),
    gpio.setup(p13, gpio.DIR_OUT),
    gpio.setup(p15, gpio.DIR_OUT),
    gpio.setup(echo, gpio.DIR_IN),
    gpio.setup(trig, gpio.DIR_OUT)
  ]);
};

我不知道为什么? 我虽然是由于繁忙的引脚,所以我在使用之前尝试重置它们。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您无需将gpio.read包装在Promise中。

   var gpio_read = function (channel) {
        gpio.read(channel, function (error, result) {
          console.log('gpio.read', error, result);
          return result;
      });
    }

您编写(new Promise(...))的方式只会创建一个Promise,但实际上不会将其返回给调用函数。为此,您将需要return new Promise(...)并更改调用代码以等待承诺(例如gpio_read.then(fn))。

对于gpio.read,一旦从板上读取它就已经返回了一个值,因此您无需将其包装在promise中。