Как я могу использовать последовательный порт синхронно в узле JS? - PullRequest
0 голосов
/ 28 августа 2018

Я использую модуль serialport в узле js и выполняю такой код, но произошла ошибка.

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 ()."

"Предупреждение об устаревании: отклонение необработанного обещания устарело. В будущем Отклонения обещаний, которые не обрабатываются, прекращают работу Узла. JS процесс с ненулевой код выхода.

Я хочу, чтобы они работали в таком порядке, как

a (0) порт открыт, запись, чтение, закрытие

a (1) порт открыть, написать, прочитать, закрыть

a (2) порт открыть, написать, прочитать, закрыть

a (3) порт открыть, написать, прочитать, закрыть

a (4) порт открыть, написать, прочитать, закрыть

я думаю, что (0) открыто, (1) открыто так ошибка .. как я могу решить эту проблему?

1 Ответ

0 голосов
/ 28 августа 2018

Вы можете вернуть обещание из функции, которая разрешается при закрытии порта:

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