Javascript Node.js和serialport;回调方法?

Javascript Node.js和serialport;回调方法?,javascript,node.js,callback,node-serialport,Javascript,Node.js,Callback,Node Serialport,我试图列出所有串行端口,并选择以/dev/cu.usbmodem开头的端口名。语境;这是一个连接到RaspberryPi运行节点的arduino。Raspberry Pi习惯于在每次重新启动时重命名端口 到目前为止,我有: com.list(function (err, ports) { ports.forEach(function(port) { var arduinoPort = port.comName; if (arduinoPort.substring(0, 16) ==

我试图列出所有串行端口,并选择以/dev/cu.usbmodem开头的端口名。语境;这是一个连接到RaspberryPi运行节点的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);
});
函数getSerialPort(回调){ "严格使用",; com.list(函数(错误、端口){ for(var i=0;i下面的函数假定在结果端口中只有一个串行端口。我将您的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);
});
函数getSerialPort(回调){ "严格使用",; com.list(函数(错误、端口){ for(var i=0;i Raspberry Pi有一个习惯,每次重新命名端口时都会对其进行重命名 重新启动

您还可以为正在使用的USB硬件创建一些udev规则,以便arduino始终映射到相同的串行端口。假设您正在运行debian

vim /etc/udev/rules.d/98-usb-serial.rules

要查找usb设备的供应商id、产品id和序列号,请使用:

dmesg
lsusb
拔下有问题的设备,将其重新插入,然后应将其映射到:

/dev/arduinoUno
/dev/arduinoMega
Raspberry Pi有一个习惯,每次重新命名端口时都会对其进行重命名 重新启动

您还可以为正在使用的USB硬件创建一些udev规则,以便arduino始终映射到相同的串行端口。假设您正在运行debian

vim /etc/udev/rules.d/98-usb-serial.rules

要查找usb设备的供应商id、产品id和序列号,请使用:

dmesg
lsusb
拔下有问题的设备,将其重新插入,然后应将其映射到:

/dev/arduinoUno
/dev/arduinoMega

或者你可以这样做,寻找正确的端口和连接自动! 它在OSX和Ubuntu上运行得很好,我还没有在Raspi上测试过它,但是你知道了。 感谢ChrisCM的“for”:

找到可用于自动连接的模式


希望有帮助

或者您也可以这样做,寻找正确的端口并自动连接! 它在OSX和Ubuntu上运行得很好,我还没有在Raspi上测试过它,但是你知道了。 感谢ChrisCM的“for”:

找到可用于自动连接的模式


希望有帮助

这太棒了!我需要删除应用程序中的“use strict”,因为一旦端口接收到数据,它就会阻塞一些函数。这非常有效!我需要删除应用程序中的“use strict”,因为一旦端口接收到数据,它就会阻塞一些函数。