ошибка обратного вызова при попытке вызвать функцию в NodeJs - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь управлять малиновым пи через веб-сокеты.Я нашел похожий проект и строил свой проект вокруг него.Мне удалось заставить все работать, кроме датчика расстояния.

    tank.getDistance = function () {
   async.parallel([
    gpio.write(trig,0),
    gpio.write(trig,1),
    gpio.write(trig,0),
  ]);
  var start,stop;
  while(gpio.read(echo) == 0){start = Date.now();}
  while(gpio.read(echo) == 1){stop = Date.now();}
  var distance = ((stop-start)/1000.0)*17000
  console.log("distance: "+ distance);
};

Вот как я пытаюсь считывать данные с ультразвукового датчика.Я проверил эту логику в Python, и она работала там.

  socket.on('keydown', function (dir) {
    switch (dir) {
      case 'up':
        tank.moveForward();
        console.log("forward");
        tank.getDistance();
        break;

это где я вызываю функцию.Но каждый раз, когда я вызываю эту функцию, я получаю

/home/pi/marinaBot/marinaBot/node_modules/rpi-gpio/rpi-gpio.js:286
            throw new Error('A callback must be provided')
            ^
Error: A callback must be provided
    at Gpio.read.input (/home/pi/marinaBot/marinaBot/node_modules/rpi-gpio/rpi-gpio.js:286:19)
    at Object.tank.getDistance (/home/pi/marinaBot/marinaBot/app.js:78:14)

, не уверенный, почему это происходит, потому что я ничего не возвращаю.Я пытался использовать другие ультразвуковые библиотеки, такие как «r-pi-usonic», но я не понимаю его настройки.Есть идеи?Просто начинаю изучать NodeJS.это может быть что-то очень простое.

1 Ответ

0 голосов
/ 01 мая 2019
gpio.read(echo, callbackfunction(error, data){})

Пожалуйста, проверьте этот документ

https://github.com/JamesBarwell/rpi-gpio.js#readchannel-callback


Вам нужна async/await функция для while

var gpio = require('rpi-gpio')

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

var echo = 16;

var calculateDistance = async function () {
    var start, stop;

    while (await gpio_read(echo) == false) { start = Date.now(); }
    while (await gpio_read(echo) == true) { stop = Date.now(); }
    var distance = ((stop - start) / 1000.0) * 17000
    console.log("distance: " + distance);
}

gpiop.setup(echo, gpio.DIR_IN)
    .then(function () {
        calculateDistance();
    })
    .catch((err) => {
        console.log('Error: ', err.toString())
    })

Обновлено содержимое:
1. Создана calculateDistance функция с async как

  var calculateDistance = async function () { ... }
return new Promise
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...