2012-02-29 2 views
3

Est-il possible de déclarer un type d'événement lors de la transmission de données de la manière que socket.io le permet. en train d'écrire avec serialport est aussi:node.js serialport module types d'événements

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

qui est reçu comme:

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

je voudrais transmettre un certain nombre d'événements différents par exemple "positionUpdate", "data", "timeSync" ..etc

par exemple serialPort.emit ("positionUpdate", slavePosition);

Merci

Répondre

3

Edit: Il semble que serialport accepte une parser en option, qui prend une EventEmitter et un tampon brut:

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

Mise à jour: De toute évidence, vous aurez besoin de tamponner le les données qui entrent, le massent d'une manière ou d'une autre, mais vous seul savez à quelles données vous attendre. Vous pouvez jeter un oeil à serialport's readline parser en introduction. Sans le tester, je pense que c'est le meilleur moyen, mais je laisse ma solution initiale ci-dessous.

Vous pouvez le faire avec un proxy:

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

Utilisation:

var serialProxy = new SerialProxy(serialport); 

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

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

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

aucun problème. La seule modification requise consistait à convertir les données en chaîne comme suit: data = data.toString(); puis continuer avec le reste de .... var prefix = data.substring (0, 3); if (prefix === "") etc – htown0724082

+0

Très bien - J'ai effectivement fait cela avec l'analyseur (la solution de rechange après ma première mise à jour, je recommande réellement de cette façon), mais je vais mettre à jour l'autre solution en conséquence. Note: S'il y a beaucoup de données, vous pouvez opérer directement sur 'Buffer' en utilisant' buffer.toString ('utf8', 0, 3) 'par exemple. Voir [docs buffer node.js] (http://nodejs.org/docs/latest/api/buffers.html). –

+0

Intéressant, avez-vous testé votre solution mise à jour? options.parser (me, buffer) ^ TypeError: La propriété 'analyseur' de l'objet # n'est pas une fonction sur [objet objet]. (/var/lib/cloud9/node_modules/serialport/serialport.js:82:17) – htown0724082