5

我正在使用 nodejs 串行端口模块(https://npmjs.org/package/serialport),并且在写入串行端口时遇到问题。

如果我只是简单地写入端口,如下所示,串行设备永远不会收到命令。

var serialport = require("serialport");
var sp = new serialport.SerialPort(serialPortPath);
sp.write("SYST:ADDR?\n");

但是,如果我使用如下所示的 setTimeout,那么它似乎可以工作?

var serialport = require("serialport");
var sp = new serialport.SerialPort(serialPortPath);
setTimeout(function(){sp.write("SYST:ADDR?\n")},1000);

仅供参考,“serialPortPath”在代码的其他地方设置。

我不确定发生了什么……有什么想法吗?

4

2 回答 2

1

我想我是从 github (https://github.com/voodootikigod/node-serialport页面......基本上看起来我错过了“open”事件,如下所示:

serialPort.on("open", function () {
  console.log("open");
  serialPort.on("data", function(data) {
    console.log("data received: " + data);
  });  
  serialPort.write("SYST:ADDR?\n", function(err, results) {
    console.log("err: " + err);
    console.log("results: " + results);
  });  
});
于 2013-01-24T03:06:43.003 回答
1

这是另一种非常有效的方法,它允许对特定串行设备进行动态寻址。就我而言,我只对连接到我们的集成系统的 Numato 设备感兴趣,这就是为什么我在列表回调中有条件逻辑的原因。

 exports.testSerial = function(data) {
    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);
        }
      }

      // the port will be opened via the constructor of this call
      var numato = new serial(port.comName, {baudrate : 19200}, function(err) {
        if(err) {
          return console.dir(err);
        }

        // by having the write call within the callback you can access it directly w/o using .on()
        numato.write('relay ' + data.state + ' ' + data.channel + '\r', function(err) {
          if(err) {
            console.dir('error writing');
            console.dir(err);
          }
          console.dir('serial message written');
          numato.close();
        });
      });

      return true;

    });
 }

希望这对将来的人有所帮助!作为参考,这是库版本 4.0.7。

于 2017-03-31T20:45:48.743 回答