是否可以按照socket.io允许的方式在传输数据时声明一个事件类型。目前用串口写的是:
serialPort.write("OMG IT WORKS\r");
接收为:
serialPort.on("data", function (data) {
foo(data);
});
我想传输一些不同的事件,例如“位置更新”、“数据”、“时间同步”等
例如 serialPort.emit("positionUpdate", slavePosition);
谢谢
最佳答案
编辑:似乎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) {
// ...
});
关于node.js 串口模块事件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9499854/