串行端口 npm 可用 COM 端口列表



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

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

这是我的代码:

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

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

对于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 }

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

var getPortsList = (callback) => {
var portsList = [];
SerialPort.list((err, ports) => {
ports.forEach((port) => {
portsList.push(port.comName);
});
callback(null, portsList);
});
};

这样做的原因是因为SerialPort.list方法是异步的。这会使您的portsList为空,因为您的SerialPort.list还没有机会完成和填充它。添加完成回调使其有时间运行并为您提供填充的端口数组。

对于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调制解调器端口的方法不正确)

if(data[0] != undefined){
let portNameToDecrease = data[0].path;
let portNoToDecrease = portNameToDecrease.charAt(3);
portNoToDecrease  = portNoToDecrease - 1 ;
portNoToDecrease = "COM"+portNoToDecrease;
data.push({path: portNoToDecrease});
//Now the data contain the required port
}

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

来源 : https://serialport.io/docs/guide-cli (串口官方文档)

安装串行端口/列表:

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 的文档,所以我从源代码中删除了一些代码。顺便说一句,我是新手。因此,如果我在提取的代码中犯了愚蠢的错误,请不要来找我。

我从这里获取了源代码:https://github.com/serialport/node-serialport/blob/master/packages/list/lib/index.js

为了进一步响应 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. 

使用提供的代码片段时,我收到list()不是定义的函数错误消息。

我能够通过稍微不同的要求串行端口来解决这个问题。对我有用的代码如下:

const { SerialPort } = require('serialPort')
SerialPort.list().then(function (data) {
debugger;
console.log(data);  
});

最新更新