Javascript 可用COM端口的Serialport npm列表

Javascript 可用COM端口的Serialport npm列表,javascript,node.js,node-serialport,Javascript,Node.js,Node Serialport,我的程序有一部分有问题,我想我知道问题是什么,我找不到解决的方法,因此需要你的帮助 我认为问题不在于serialport.list函数,而在于我使用它的方式 这是我的代码: var getPortsList= ()=>{ var portsList = []; SerialPort.list((err, ports)=>{ ports.forEach((ports)=>{ portsList.push(ports.comNam

我的程序有一部分有问题,我想我知道问题是什么,我找不到解决的方法,因此需要你的帮助

我认为问题不在于serialport.list函数,而在于我使用它的方式

这是我的代码:

    var getPortsList= ()=>{
    var portsList = [];
    SerialPort.list((err, ports)=>{
      ports.forEach((ports)=>{
        portsList.push(ports.comName);
        //console.log(portsList);
      });
    });

    return portsList;

  };
因此,我将list函数包装在自己的函数中,并在需要检查哪些端口可用时调用它。我遇到的问题是,我总是返回一个空数组。如果我从forEach内部得到console.log,我肯定会得到COM端口名,如果我在forEach循环之后从list函数内部得到console.log,我会得到数组,并且不是空的。 我只能假设这是与javascript的并发性有关的问题,但我不太确定如何解决这个问题。 我可以看到这是一个重要的概念,它会一直出现,我想更好地理解它。 任何关于处理此类问题的方法或适当链接的信息都将受到重视。 非常感谢。 顺致敬意,
路易斯

我希望下面的解决方案对你有用

var getPortsList = (callback) => {
  var portsList = [];

  SerialPort.list((err, ports) => {
    ports.forEach((port) => {
      portsList.push(port.comName);
    });

    callback(null, portsList);
  });
};

之所以这样做是因为
SerialPort.list
方法是异步的。这会使您的
端口列表
为空,因为您的
SerialPort.list
还没有机会完成并填充它。添加一个完成回调可以让它有时间运行,并为您提供一个填充的端口阵列。

我希望下面的解决方案对您有用

var getPortsList = (callback) => {
  var portsList = [];

  SerialPort.list((err, ports) => {
    ports.forEach((port) => {
      portsList.push(port.comName);
    });

    callback(null, portsList);
  });
};

之所以这样做是因为
SerialPort.list
方法是异步的。这会使您的
端口列表
为空,因为您的
SerialPort.list
还没有机会完成并填充它。添加一个完成回调可以让它有时间运行,并为您提供一个填充的端口数组。

对于Windows 10,serialPort的列表方法会打印所有可用的Com端口,其中包含信息

const serialPort = require('serialport');

serialPort.list().then(function(ports){
  ports.forEach(function(port){
    console.log("Port: ", port);
  })
});
在终端上:

Port:  { comName: 'COM1',
  manufacturer: '(Standard port types)',
  serialNumber: undefined,
  pnpId: 'ACPI\\PNP0501\\0',
  locationId: undefined,
  vendorId: undefined,
  productId: undefined }
Port:  { comName: 'COM4',
  manufacturer: 'HHD Software Ltd.',
  serialNumber: undefined,
  pnpId: 'ROOT\\PORTS\\0000',
  locationId: undefined,
  vendorId: undefined,
  productId: undefined }
Port:  { comName: 'COM5',
  manufacturer: 'HHD Software Ltd.',
  serialNumber: undefined,
  pnpId: 'ROOT\\PORTS\\0001',
  locationId: undefined,
  vendorId: undefined,
  productId: undefined }

对于Windows 10,serialPort的列表方法会打印所有可用的Com端口,其中包含信息

const serialPort = require('serialport');

serialPort.list().then(function(ports){
  ports.forEach(function(port){
    console.log("Port: ", port);
  })
});
在终端上:

Port:  { comName: 'COM1',
  manufacturer: '(Standard port types)',
  serialNumber: undefined,
  pnpId: 'ACPI\\PNP0501\\0',
  locationId: undefined,
  vendorId: undefined,
  productId: undefined }
Port:  { comName: 'COM4',
  manufacturer: 'HHD Software Ltd.',
  serialNumber: undefined,
  pnpId: 'ROOT\\PORTS\\0000',
  locationId: undefined,
  vendorId: undefined,
  productId: undefined }
Port:  { comName: 'COM5',
  manufacturer: 'HHD Software Ltd.',
  serialNumber: undefined,
  pnpId: 'ROOT\\PORTS\\0001',
  locationId: undefined,
  vendorId: undefined,
  productId: undefined }

对于windows 7节点串行端口8,电子内部,使用中兴usb gsm调制解调器

    // We are using electron and i am using electronService to check if we are inside electron
 if(this._electronService.isElectronApp) {

    // getting serialPort inside electron   
    const serialPort = window['require']('serialport');

    // the serialPort will return promise so we are using then 
    serialPort.list().then(function (data) {
        console.log(data);  
    });

}
虽然它没有列出中兴USB调制解调器,但它列出了其他端口。我正在使用小技巧获取usb调制解调器端口号(我知道获取usb调制解调器端口的方法不正确)


对于windows 7节点串行端口8,电子内部,使用中兴usb gsm调制解调器

    // We are using electron and i am using electronService to check if we are inside electron
 if(this._electronService.isElectronApp) {

    // getting serialPort inside electron   
    const serialPort = window['require']('serialport');

    // the serialPort will return promise so we are using then 
    serialPort.list().then(function (data) {
        console.log(data);  
    });

}
虽然它没有列出中兴USB调制解调器,但它列出了其他端口。我正在使用小技巧获取usb调制解调器端口号(我知道获取usb调制解调器端口的方法不正确)


对于那些想知道为什么标记为答案的解决方案不起作用的人, SerialPort.List已从SerialPort弃用,并作为命令工具移动到SerialPort/List

资料来源:(SerialPort官方文件)

SerialPort/List的安装:

npm install @serialport/list
如果安装失败,请使用sudo运行

以及获取端口列表的方法:

const bindings = require('@serialport/bindings')

var listOfPorts=[];

//called automatically by bindings.list()
function list(ports) {
  listOfPorts=ports;
  // now listOfPorts will be the port Objects
  console.log(listOfPorts);
}

bindings.list().then(list, err => {
  process.exit(1)
})
我找不到关于带有nodejs的serialPort/list的很多文档,所以我从源代码中提取了一些代码。顺便说一句,我是个新手。所以,如果我在提取代码时犯了愚蠢的错误,请不要对我指手画脚


我从这里获取了源代码:

对于那些想知道为什么标记为答案的解决方案不起作用的人, SerialPort.List已从SerialPort弃用,并作为命令工具移动到SerialPort/List

资料来源:(SerialPort官方文件)

SerialPort/List的安装:

npm install @serialport/list
如果安装失败,请使用sudo运行

以及获取端口列表的方法:

const bindings = require('@serialport/bindings')

var listOfPorts=[];

//called automatically by bindings.list()
function list(ports) {
  listOfPorts=ports;
  // now listOfPorts will be the port Objects
  console.log(listOfPorts);
}

bindings.list().then(list, err => {
  process.exit(1)
})
我找不到关于带有nodejs的serialPort/list的很多文档,所以我从源代码中提取了一些代码。顺便说一句,我是个新手。所以,如果我在提取代码时犯了愚蠢的错误,请不要对我指手画脚


我从这里获取了源代码:

为了进一步改进janithcooray的响应,更新为使用async/await,这对我来说很有用

const bindings = require("@serialport/bindings");

/**
 * Get a list of available serial ports. 
 * @param {boolean} verbose - Log results if true. 
 * @returns {{status: string, data: array|object}} - 'ok' or 'fail' with details to handle elsewhere. 
 */
const listPorts = async (verbose) => {
  let result;
  try {
    const portList = await bindings.list();
    if (verbose) console.table(portList); // Print out the array if desired.
    result = { status: "ok", data: portList };
  } catch (err) {
    if (verbose) console.log(err); // To see what the error is, if desired.
    result = { status: "fail", data: err };
  }
  return result;
};

// Run the command.
const { portStatus, portList } = listPorts(true);
// If portStatus is 'ok' then portsList is ready to use. 


为了进一步得到janithcooray的响应,更新为使用async/await,这对我来说很有用

const bindings = require("@serialport/bindings");

/**
 * Get a list of available serial ports. 
 * @param {boolean} verbose - Log results if true. 
 * @returns {{status: string, data: array|object}} - 'ok' or 'fail' with details to handle elsewhere. 
 */
const listPorts = async (verbose) => {
  let result;
  try {
    const portList = await bindings.list();
    if (verbose) console.table(portList); // Print out the array if desired.
    result = { status: "ok", data: portList };
  } catch (err) {
    if (verbose) console.log(err); // To see what the error is, if desired.
    result = { status: "fail", data: err };
  }
  return result;
};

// Run the command.
const { portStatus, portList } = listPorts(true);
// If portStatus is 'ok' then portsList is ready to use. 


你好,阿马拉纳德,这确实有效。但我可以用一些背景知识来解释它的工作原理,也就是说,为什么传递回调函数比我的解决方案更有效?嗨,Amaranadh,这确实有效。但我可以通过一些背景知识来了解它的工作方式,也就是说,为什么传递回调函数比我的解决方案更有效?这个回调过程现在不起作用<代码>错误:SerialPort.list不再接受回调,只返回解决方案的承诺。该代码(编辑为使用承诺)似乎适用于Windows 7。答案指定Windows 10有什么原因吗?此回调过程现在不起作用<代码>错误:SerialPort.list不再接受回调,只返回解决方案的承诺。该代码(编辑为使用承诺)似乎适用于Windows 7。答案中指定Windows 10有什么原因吗?