簡體   English   中英

將Python腳本轉換為Node.js的問題

[英]Issues converting Python script to Node.js

更新:重寫代碼,但仍然無法正常工作

下面的新代碼仍在復制python腳本的功能,但是嘗試簡化操作(還使用其他庫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);

原始帖子

我正在嘗試將作為RPi開發項目一部分的有效python腳本轉換為node.js,以避免需要使用websockets。

這是有效的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)

該腳本的功能是使用連接的接近傳感器來測量距離。

我目前對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();

而且這些調用實際上是異步的,因此您必須將它們明確地鏈接在一起。

編輯:請注意,這只是代碼最終查找的指南。

(1)注意,我不處理錯誤。 (2)深層嵌套通常稱為“回調地獄”,異步等模塊可以使代碼變得更好(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)
        })
    })
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM