Javascript 可用COM端口的Serialport npm列表
我的程序有一部分有问题,我想我知道问题是什么,我找不到解决的方法,因此需要你的帮助 我认为问题不在于serialport.list函数,而在于我使用它的方式 这是我的代码: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
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有什么原因吗?