0

我正在尝试使用 node.js 串行端口模块在运行时获取设备的COM 端口。

const SerialPort = require('serialport');
var fs = require('fs');

var serialVar = getSerialPort();

console.log("outer: "+serialVar);

function getSerialPort() 
{
    SerialPort.list(function (err, ports) {
        ports.forEach(function(port) {
            if (port.pnpId == "USB\\VID_0451&PID_BEF3&MI_00\\6&808E38E&0&0000") {
                console.log("inner: "+port.comName);
                return port.comName;
            } 
        });
    });
}

输出:

outer: undefined
inner: COM8

从输出来看,似乎是getSerialPort()在脚本中的所有其他内容都运行之后完成,而不是在继续超过它被调用的点之前全部运行。我不确定这是为什么。

我尝试了几种变体,例如:

const SerialPort = require('serialport');
var fs = require('fs');

var serialVar = {};
getSerialPort();

console.log("outer: "+serialVar.port);
function getSerialPort() 
{
    SerialPort.list(function (err, ports) {
        ports.forEach(function(port) {
            if (port.pnpId == "USB\\VID_0451&PID_BEF3&MI_00\\6&808E38E&0&0000") {
                serialVar.port = port.comName;
                console.log("inner: "+serialVar.port);
            }
        });
    });
}

没有变化。

4

1 回答 1

1

Javascript 本质上是异步的。发生的事情是console.log在列出串行端口之前正在执行。该库提供了一个回调(您正在使用)和一个承诺。这些中的任何一个都可以用来确保事情按顺序运行。我推荐诺言。

const SerialPort = require('serialport');

SerialPort.list() // returns promise that resolves to list of ports
    // filters for a specific port
    .then(ports => ports.filter(port => port.pnpId == "USB\\VID_0451&PID_BEF3&MI_00\\6&808E38E&0&0000"))
    // logs info
    .then(ports => {console.log('inner',port[0].comName, 'outer', port[0]); return ports})

于 2017-11-06T13:56:04.190 回答