我在节点js中使用serialport模块,并执行类似的代码,但是发生了错误。
for(i=0; i<5; i++){
a(i) ;
}
function a(i){
port = new serialport(port_name,{
baudRate:9600 ,
parser: new serialport.parsers.Readline('\n')
});
port.on('open',function(){
port.write(port_command+'\n');
data = port.read();
console.log(i + data);
port.close();
});
}
但发生错误
“ UnhandledPromiseRejectionWarning:错误资源暂时不可用,无法锁定端口”
“ UnhandledPromiseRejectionWarning:未处理的诺言拒绝。此错误可能是由于在没有catch块的情况下抛出了异步函数而引起的,或者是由于没有使用.catch()处理的诺言而引起的。”
“ DeprecationWarning:已弃用未处理的承诺拒绝。将来, 未处理的承诺拒绝将终止节点。 js过程 非零退出代码。
我希望它们按
的顺序运行a(0)端口打开,写入,读取,关闭
a(1)端口打开,写入,读取,关闭
a(2)端口打开,写入,读取,关闭
a(3)端口打开,写入,读取,关闭
a(4)端口打开,写入,读取,关闭
我认为a(0)打开,a(1)打开,所以出错..我该如何解决这个问题?
答案 0 :(得分:3)
您可以从端口关闭时解析的函数中返回一个承诺:
function ping(i){
const port = new serialport(port_name,{
baudRate:9600 ,
parser: new serialport.parsers.Readline('\n')
});
port.on('open',function(){
port.write(port_command+'\n');
data = port.read();
console.log(i + data);
port.close();
});
return new Promise(resolve => port.on("close", resolve));
}
现在您可以实现循环:
(async function loop() {
for(let i = 0; i < 3; i++) {
await ping(i);
}
})();