2017-09-08 11 views
1

/WノードSERIALPORT問題私は1つの要素私は2つの(私たちのユースケースの最大)のものを渡したときにすべてが、素晴らしい作品を持つ配列を渡し、私は次のエラーを取得する:複数の書き込み

ここ

There's no write queue for that file descriptor (after write)!

私のコードです:

exports.triggerPhysical = function(state, alerts) { 

console.dir("IN PHYSICAL"); 
console.dir(alerts); 

    SerialPort.list(function(err, ports) { 

     var port = {}; 

     for(var i = 0; i < ports.length; i++) { 
     try { 
      if(typeof ports[i].manufacturer != 'undefined' && ports[i].manufacturer.includes("Numato")) { 
      port = ports[i]; 
      } 
     } catch(err) { 
      console.dir(err); 
     } 
     } 

     var numato = new SerialPort(port.comName, {baudrate : 19200}, function(err) { 
     if(err) { 
      return console.dir(err); 
     } 

     console.dir('calling write');  

     for(var j = 0; j < alerts.length; j++) { 
      numato.write('relay ' + state + ' ' + alerts[j].index + '\r', function(err) { 
       if(err) { 
       console.dir('error writing'); 
       console.dir(err); 
       } 
       console.dir('serial message written');    
      });   
     } 

     numato.close(); 

     return true; 

    }); 
    }); 
} 

最初の書き込みは素晴らしい、2番目のものは失敗します。私は明らかな解決策があると思っていますが、私はそれを見つけることはできません。どんな洞察も高く評価されるだろう。

答えて

0

私はこの問題を解決するために2つのことをやりました。最初にnode-serialportライブラリのバージョン5.xにアップグレードしました。

第二に、私は次のように私のコードを変更:

exports.triggerPhysical = function(state, alerts) { 

    var port = new SerialPort('/dev/ttyACM0'); 

    port.on("open", function() { 
     alerts.forEach(function(alert, idx) { 
      str = 'relay ' + state + ' ' + alert.index + '\r'; 
      port.write(str, function(err, results) { 
       if(err) { 
        console.dir("err writing"); 
        console.dir(err); 
       } else { 
        console.dir(results); 
       } 
      }); 
     });  
    }) 

    port.drain(writeDone);  


    function writeDone() { 
     console.dir("In writeDone"); 
     port.close(); 
    } 
} 

私は今、すべてのエラーを発生させることなく連続して書き込みを行うことができる午前とポートが奇妙なロック状態で終了していません。

関連する問題