2012-03-21 45 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上發出一些命令時,我得不到正確的輸出。

E.g

假設我的輸出應該是

Data : abcd1234 

,而是它我

Data : abc 
Data : d1234 

總之我的輸出breaked。 我無法從我的輸出完全中斷的位置外推。這是隨機的。 任何人都可以給我任何想法?

在此先感謝。

回答

0

如node.js的所有流,數據的讀出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 ... – 2012-03-21 10:24:00

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

關鍵在於'數據'只要收到「足夠」就會觸發。你需要緩衝響應。看看Substack的[Stream Handbook](https://github.com/substack/stream-handbook)瞭解更多詳情。 – 2013-05-16 17:44:22