2013-01-23 68 views
3

我正在使用nodejs serialport模塊(https://npmjs.org/package/serialport),並且在寫入串行端口時遇到問題。nodejs 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」在代碼的其他地方設置。

我不確定發生了什麼...有什麼想法?

回答

0

我想我是從GitHub的(https://github.com/voodootikigod/node-serialport頁想出...基本上它看起來像我錯過了「開放」的事件,如下圖所示:

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