如何在Node js中同步使用串行端口?

时间:2018-08-28 04:48:39

标签: javascript node.js asynchronous async-await serial-port

我在节点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)打开,所以出错..我该如何解决这个问题?

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);
   }
 })();