node.js多个串口

时间:2013-07-01 23:27:42

标签: node.js

我正在将nodePorts模块用于nodejs,并且需要能够从可变数量的串口打开,写入和读取。

所以我要做的是首先为serialPort实例创建一个数组对象,然后在循环中处理它们:

var serialport = require("serialport");
var SerialPort = serialport.SerialPort; // localize object constructor
var devs = ["/dev/tty.SerialPort","/dev/tty.HHW-SPP-1800-2-DevB"];
var ports = [];
for (var i = 0; i < devs.length; i++) {
    console.log(devs[i]);
    var port = new SerialPort(devs[i],{ baudrate:9600, parser: serialport.parsers.readline("\n") });
    ports.push(port);


}

然后我有另一个函数,我定期调用它来读取/写入端口:

function minute(){
    for (var i = 0; i < ports.length; i++) {
        console.log(i);
        ports[i].on("open", function (path) {
            console.log('opened');

            ports[i].write("Helo World\n", function(err,res) {
                if(err) console.log('err ' + err);
                console.log('results ' + res);
            });         

            ports[i].on("data", function (data) {
                console.log("here: "+data);
            });
        });


    }
}

问题是minute()函数执行,但它不会尝试打开或读/写端口。

我做错了什么?并且有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

这里有一些误解。

首先,您无需定期轮询您的端口。 Nodejs使用事件循环(或多或少)来处理IO,并将为您进行轮询。因此,您需要做的就是为open事件设置回调,每个端口一次。在您的代码中,每次调用minute()时,您似乎都在读取回调。这不是必要的。

其次,javascript没有变量的块范围。相反,您无意中创建了一个闭包,并且您的代码出错了。在以下块中:

for (var i = 0; i < ports.length; i++) {
    ports[i].on("open", function (path) {
        ports[i].write("Helo World\n", function(err,res) {
            if(err) console.log('err ' + err);
            console.log('results ' + res);
        });         

        ports[i].on("data", function (data) {
            console.log("here: "+data);
        });
    });
}

当您调用ports.on的回调时,iports[i].writeports[i].on("data")的值不是回调时i的值设置,正如您所期望的那样。相反,因为您创建了一个闭包,所以i的值不会被绑定(设置),直到回调执行。在此示例中,您的回调中的每个人i都将设置为ports.length,这是[{1}}

的最后评估值

我创建了plunkr that illustrates the problem with your for loop

解决此问题的一种方法是使用匿名方法,并将值i绑定到新的局部变量。在下面的代码中,i会立即执行,并将值(function(index){})(i);绑定到index的适当值。

i

您也可以将该方法拉出到单独的函数中。 ports[i].on("open", function (path) { (function(index) { ports[index].write("Helo World\n", function(err,res) { if(err) console.log('err ' + err); console.log('results ' + res); }); ports[index].on("data", function (data) { console.log("here: "+data); }); })(i); }); 立即执行,并绑定到正确的端口。

setupHandlers()