gpt4 book ai didi

javascript - Node.js 和串口;回调方法?

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:14 25 4
gpt4 key购买 nike

我正在尝试列出所有串行端口并选择以/dev/cu.usbmodem 开头的端口名称。对于上下文;它是一个连接到 RaspberryPi 运行 Node 的 arduino。 Raspberry Pi 有每次重新启动时重命名端口的习惯。

到目前为止我有这个:

com.list(function (err, ports) {
ports.forEach(function(port) {
var arduinoPort = port.comName;
if (arduinoPort.substring(0, 16) == "/dev/cu.usbmodem") {
var SERIALPORT_ID = arduinoPort;
}
});
});

这需要足够长的时间,导致下一条语句失败,因为 SERIALPORT_ID 变量尚未声明;

var serialPort = new com.SerialPort(SERIALPORT_ID, {
baudrate: 57600,
parser: com.parsers.readline('\r\n')
});

什么回调或结构化技术将使第二个语句在执行之前等待第一个语句声明变量?

最佳答案

下面的函数假设您的结果端口中只有一个串行端口。我将你的 ports.forEach 更改为标准 for 循环。我相信这个循环中正在进行的工作是同步的。我认为 forEach 是同步的,但我知道 for(var i = 0; ....) 是同步的,如果我们只有一个正确的“端口”,那么我们希望能够跳过其他结果的循环。如果我对“只有一个好端口”的假设不正确,那么这一逻辑很容易改变。

function getSerialPort(callback) {
'use strict';

com.list(function (err, ports) {

for (var i = 0; i < ports.length; i++) {//ports.forEach works too, but I know this is sync, and that's what we want in this case so we can break out of the loop when we find the right port
var port = ports[i];
var arduinoPort = port.comName;

if (arduinoPort.substring(0, 16) === "/dev/cu.usbmodem") {

var serialPort = new com.SerialPort(arduinoPort, {
baudrate: 57600,
parser: com.parsers.readline('\r\n')
});

callback(serialPort);
return;//I'm not sure what return does in a ports.forEach situation, so I changed it to a standard for loop, so that we know that this is breaking us out of it.
}
}
});
}

getSerialPort(function (serialPort) {
'use strict';
console.log('Serial Port: ' + serialPort);
});

关于javascript - Node.js 和串口;回调方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17971199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com