node.js串口模块事件类型

3

在像socket.io这样的数据传输方式中,是否可以声明事件类型。目前使用serialport编写的代码如下:

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

这将作为接收到:

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

我想传输多个不同的事件,例如“positionUpdate”,“data”,“timeSync”等。
例如: serialPort.emit("positionUpdate", slavePosition);
谢谢。
1个回答

3

编辑:看起来串口接受一个可选的解析器,它使用一个事件发射器和原始缓冲区:

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

更新:显然,您需要缓冲接收到的数据,以某种方式对其进行处理等,但只有您知道要期望什么数据。您可以查看串行端口的readline解析器作为介绍。(点击链接) 没有测试它,我认为这是更好的方法,但我将保留我的初始解决方案如下。
您可以使用代理来实现此操作:
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) {
  // ...
});

没有问题。唯一需要编辑的是将数据转换为字符串,如下所示: data = data.toString(); 然后继续执行其余的代码... var prefix = data.substring(0, 3); if (prefix === "") 等等 - htown0724082
太好了 - 我实际上已经用解析器做到了(这是我第一次更新后的另一种解决方案,我实际上推荐这种方式),但我会相应地更新另一个解决方案。注意:如果有大量数据,您可能希望直接使用buffer.toString('utf8', 0, 3)来操作Buffer。请参阅node.js缓冲区文档 - Linus Thiel
有趣,你测试过更新的解决方案了吗?options.parser(me, buffer) ^ 类型错误:对象#<Object>的属性'parser'不是函数 在[object Object].<anonymous> (/var/lib/cloud9/node_modules/serialport/serialport.js:82:17) - htown0724082
奇怪,我在这里进行了测试(使用/dev/urandom作为“串行端口”,因为我没有一个...),它可以工作。你真的指定它为var serialport = new SerialPort("/dev/foo", { parser: myParser });吗? - Linus Thiel
`var SerialPort = require("serialport").SerialPort;var serialPort1 = new SerialPort("/dev/ttyO1" , { parser: myParser } ); var serialPort2 = new SerialPort("/dev/ttyO2" , { parser: myParser } ); 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); };serialPort2.on("foo", function(data) { console.log(data); });setInterval( function(){ serialPort1.write("footest"); //console.log("msg sent"); },2000);` - htown0724082
尝试在声明串口之前声明myParser,或者将其声明为一个函数:function myParser(emitter, buffer) { ... } - Linus Thiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接