将Python脚本转换为Node.js的问题

更新:重写代码,但仍然无法正常工作

下面的新代码仍然复制python脚本的function,但是试图简化的东西(也使用不同的库https://npmjs.org/package/rpi-gpio )现在的问题是,总是得到一个类似的阅读因此显然不使用来自GPIO引脚的反馈。

var gpio = require('rpi-gpio'); var pin = 12, delay = 0.0005, startTime, endTime, duration, distance; function on(){ setTimeout(gpio.write(pin,1,off),delay); } function off(){ setTimeout(gpio.write(pin,0,listen),delay); } function listen(){ gpio.setup(pin, gpio.DIR_IN); startTime = Date.now(); console.log('Start: ' + String(startTime)); return; } gpio.on('change', function(channel, value) { endTime = Date.now(); console.log('End: ' + String(endTime)); duration = endTime - startTime; console.log('Duration: ' + String(duration)); distance = ((duration / 100) * 3400) / 2; console.log(distance); return process.exit(0); }); gpio.setup(pin, gpio.DIR_OUT, on); 

原来的post

我正在尝试将工作的Python脚本作为我的RPi开发项目的一部分转换为node.js,以避免需要使用websocket。

这是工作的Python脚本:

 import time import RPi.GPIO as GPIO import websocket for x in range(0, 10): GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.OUT) #cleanup output GPIO.output(12, 0) time.sleep(0.000002) #send signal GPIO.output(12, 1) time.sleep(0.000005) GPIO.output(12, 0) GPIO.setup(12, GPIO.IN) while GPIO.input(12)==0: starttime=time.time() while GPIO.input(12)==1: endtime=time.time() duration=endtime-starttime distance=duration*34000/2 print str(x + 1) + ": " + str(distance) time.sleep(1) 

该脚本的function是使用附加的接近传感器来测量距离。

我目前(凌乱)重写node.js(GPIO部分使用https://github.com/rakeshpai/pi-gpio ):

 var gpio = require("pi-gpio"); function rightPingOn() { gpio.write(12, 1, function(err){ //if(err) throw err; console.log("Sent 1"); }); // Set pin 12 high } function rightPingOff() { gpio.write(12, 0, function(err){ //if(err) throw err; console.log("Sent 0"); }); // Set pin 12 low } function setRightListen() { gpio.setDirection(12, "input"); // Open pin 16 for input } function setRightOutput(){ gpio.setDirection(12, "output"); // Open pin 12 for output } function right_listen(){ gpio.read(12, function(err, value){ //if(err) throw err; console.log("Listened"); return value; }); } gpio.open(12); setRightOutput(); rightPingOff(); setTimeout(rightPingOn, 0.5); setTimeout(rightPingOff, 0.5); setRightListen(); while (right_listen == 0){ var startTime = getTime(); } while (right_listen == 1){ var endTime = getTime(); } gpio.close(12); var duration = endTime - startTime; var distance = duration * 3400 / 2 console.log(distance); 

我目前所有的这个脚本的输出是:

 NaN Sent 0 Sent 1 Sent 0 

任何帮助,将不胜感激!

天啊。 我想你会遇到困难。 我猜Python的GPIO接口是同步的?

首先,像这样的投票:

 while (right_listen == 0){ var startTime = getTime(); } while (right_listen == 1){ var endTime = getTime(); } 

可能会导致无限循环,因为应该改变right_listen值的right_listen将永远不会有机会运行。 如果以下部分按照设定顺序发生:

 gpio.open(12); setRightOutput(); rightPingOff(); setTimeout(rightPingOn, 0.5); setTimeout(rightPingOff, 0.5); setRightListen(); 

而那些调用实际上是asynchronous的,你将不得不明确地链接在一起。

编辑:注意这只是代码可能最终看起来的指导方针。

(1)通知我不处理错误。 (2)深层嵌套通常被称为“callback地狱”,像asynchronous这样的模块可以使代码更好。(3)这里可能有小错误。

 gpio.open(12, function(error) { gpio.setDirection(12, "output", function(error) { gpio.write(12, 0, function(error) { setTimeout( function() { var started = getTime(); gpio.setDirection(12, "input", function(error, value) { console.log("received:", value, "after:", getTime()-started); }) }, 500) }) }) })