node.js serialport模块事件类型

时间:2012-02-29 13:16:30

标签: node.js serial-port

是否可以在socket.io允许的方式传输数据时声明事件类型。目前使用serialport编写如下:

serialPort.write("OMG IT WORKS\r");

收到:

serialPort.on("data", function (data) {
    foo(data);
});

我想传输许多不同的事件,例如“positionUpdate”,“data”,“timeSync”..等等

e.g     serialPort.emit(“positionUpdate”,slavePosition);

由于

1 个答案:

答案 0 :(得分:3)

修改:似乎serialport接受一个可选parser,其中包含EventEmitter和原始缓冲区:

var myParser = function(emitter, buffer) {
  // Inspect buffer, emit on emitter:
  if(buffer.toString("utf8", 0, 3) === "foo")
    emitter.emit("foo", buffer);
  else
    emitter.emit("data", buffer);
};

var serialport = new SerialPort("/dev/foo", { parser: myParser });

serialport.on("foo", function(data) {
  // Do stuff
});

更新:显然,你需要缓冲进来的数据,以某种方式按摩它等,但只有你知道预期的数据。您可以查看serialport's readline parser作为简介。

如果不进行测试,我认为这是更好的方法,但我将初始解决方案留在下面。

您可以使用代理执行此操作:

var events = require('events');
var util = require('util');

var SerialProxy = function(serialport){
  events.EventEmitter.call(this);
  var self = this;
  serialport.on("data", function(data) {
    // Inspect data to see which event to emit
    // data is a Buffer object
    var prefix = data.toString("utf8", 0, 3);
    if(prefix === "foo")
      self.emit("foo", data.toString("utf8", 3));
    else if(prefix === "bar")
      self.emit("bar", data.toString("utf8", 3));
    else
      self.emit("data", data.toString("utf8"));
  });
};

util.inherits(SerialProxy, events.EventEmitter);

用法:

var serialProxy = new SerialProxy(serialport);

serialProxy.on("foo", function(data) {
  // ...
});

serialProxy.on("bar", function(data) {
  // ...
});

serialProxy.on("data", function(data) {
  // ...
});