2012-03-21 11 views
1

ubantuにwavecom GSM modemを接続しました。私はnode.js言語を使ってGSMモデムと通信します。 Child Processでモデムにコマンドを送信します。ここにある例子プロセスで出力が破損していますnodejsプロセス

var spawn   = require("child_process").spawn, 
    exec   = require('child_process').exec; 

// Write dev_ttyUSB15.tmp file 
var child = exec('cat </dev/ttyUSB15> /tmp/dev_ttyUSB15.tmp'); 

// Read dev_ttyUSB15.tmp file 
var m1 = spawn('tail',['-f','/tmp/dev_ttyUSB15.tmp']); 

// on data event is emitted when dev_ttyUSB15.tmp file has some data 
m1.stdout.on('data', function (data) { 
    console.log("Data : "+data); // this is executed as output 
}); 

私はポート/ dev/ttyUSB15でいくつかのコマンドを起動すると正しく出力されません。

例えば

私の出力は

Data : abcd1234 

ではなく、それをする必要がありますと仮定し、私は私の出力がbreakedさ要するに

Data : abc 
Data : d1234 

を得ました。 私の出力が正確にどこから外れているかを推測することはできません。ランダムです。 誰も私に何か考えを与えることができますか?

ありがとうございます。 データ:Node.jsの中のすべてのストリームとして

答えて

0

は、データの読み出しは、2つの別個のイベントで構成されています。

ストリーム内で一部のデータが判読可能な場合(あなたの場合は2回)、イベントが発生します。

endデータイベントがもう発生しなくなると、イベントが発生します。

var blob = ""; 
m1.stdout.on('data', function (data) { 
blob += data; 
}); 

m1.stdout.on('end', function() { 
console.log("Data : " + blob); // here you have all the data within one variable 
}); 
+0

申し訳ありませんが、「終了」イベント尾のプロセスが外部殺すときにのみ発動する...そして尾のプロセスが殺されている場合、私は聞くことができません/ dev/ttyUSB15の任意のデータ... –

2

モデムを使用して話しているプロトコルがわからなくても、言い表せません。 \n区切り、あなたは\n上のデータと分割をバッファリングする必要があります:

var buffer = ''; 
m1.stdout.on('data', function(data) { 
    var received = (buffer + data).split('\n'); 
    buffer = received.pop().trim(); 
    console.log(received.join('')); 
}); 
+0

キーは、「十分」を受信するたびに 'data'が起動するということです。あなたは応答をバッファリングする必要があります。詳細は、Substackの[ストリームハンドブック](https://github.com/substack/streamhandbook)をご覧ください。 –