![](/img/trans.png)
[英]Communicating with ESP32 via serial with serialports.js (node.js)
[英]node.js multiple SerialPorts
我正在使用用于nodejs的SerialPorts模块,并且需要能够从可变数量的串行端口打开,写入和读取。
因此,我要做的是首先为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()函数,但是它没有尝试打开或读取/写入端口。
我究竟做错了什么 ?? 有没有更好的办法做到这一点?
这里有一些误解。
首先,您不需要定期轮询端口。 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
被调用,值了i
在ports[i].write
和ports[i].on("data")
不是的价值i
当回调的设置,因为你期待。 相反,因为您已经创建了一个闭包,所以在执行回调之前,不会绑定(设置) i
的值。 在此示例中,您的所有回调i
都将设置为ports.length
,这是i
的最后评估值
我创建了一个plunkr来说明您的for循环的问题 。
解决此问题的一种方法是使用匿名方法,并将值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()
立即执行,并绑定到正确的端口。
for (var i = 0; i < ports.length; i++) {
setupHandlers(ports[i]);
}
function setupHandlers(port) {
port.on("open", function (path) {
ports.write("Helo World\n", function(err,res) {
if(err) console.log('err ' + err);
console.log('results ' + res);
});
ports.on("data", function (data) {
console.log("here: "+data);
});
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.