Типы событий модуля serialport для node.js - PullRequest
3 голосов
/ 29 февраля 2012

Можно ли объявить тип события при передаче данных так, как позволяет socket.io.В настоящее время запись с использованием serialport имеет вид:

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

, который принимается как:

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

Я хотел бы передать ряд различных событий, например, "positionUpdate", "data", "timeSync "..etc

например, serialPort.emit (" positionUpdate ", slavePosition);

Спасибо

1 Ответ

3 голосов
/ 29 февраля 2012

Редактировать: Кажется, что 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
});

Обновление: Очевидно, вам нужно будет буферизовать поступающие данные, каким-то образом их массировать и т. Д., Но только вы знаете, какие данные ожидать. Вы можете взглянуть на синтаксический анализатор readline serialport в качестве введения.

Без тестирования, я думаю, что это лучший способ, но я оставляю свое первоначальное решение ниже.

Вы можете сделать это с прокси:

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) {
  // ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...