具有多个写入的Node-SerialPort问题

时间:2017-09-08 22:51:36

标签: node.js serial-port node-serialport

当我传递一个包含1个元素的数组时,一切都很好,当我传递一个有两个(对于我们的用例最大)时,我得到以下错误:

  

该文件描述符没有写入队列(写入后)!

这是我的代码:

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;

    });
  });
}

第一次写作很好,第二次写失败。我猜有一个明显的解决方案,但我找不到它。任何见解都会非常感激。

1 个答案:

答案 0 :(得分:0)

我最终做了两件事来解决这个问题。首先,我升级到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();
    }
}

我现在能够连续写入而不会导致任何错误,并且端口不会以奇怪的锁定状态结束。