[英]Reading in Multiple Serial Inputs with Node.Js
我一直在研究一個簡單的腳本來監控我實驗室中的6個arduino單元。 我好像差不多了!
我目前的問題是將每個數據集很好地捆綁在一個字符串中。 實際上,我可以打開與所有串口的連接,在他們發出數據時接收他們的數據,但缺少將其組織到捆綁中的代碼塊。 我曾考慮過嘗試創建一個臨時數組來附加塊或生成子進程。 但是,我遇到了子進程的困難,並且不確定如何以適當的方式構造數組。 一旦我有一個捆綁的字符串,我將發送到我的服務器上的數據庫。 我確實有這種感覺,我可能會以一種不合適的方式做到這一點,任何和所有的建議都是非常令人沮喪的!
PS:你可能會注意到只有5個arduinos顯示,這只是為了讓事情變得不那么復雜,因為第6個arduino也顯示為com9。
謝謝
代碼
var serialport = require('serialport');
var SerialPort = serialport.SerialPort;
// list serial ports:
serialport.list(function (err, ports) {
console.log(" Readout all availiable Com Ports and their pnpID: ");
ports.forEach(function(port) {
console.log(port.comName);
console.log(port.pnpId);
console.log(port.manufacturer);
var serialPort = new SerialPort(port.comName, {baudrate: 9600
}, false);
serialPort.open(function (error) {
if ( error ) {
console.log('failed to open: '+error);
} else {
console.log('open');
serialPort.on('data', function(data) {
console.log('data received: ' + port.comName+ ' ' + data);
});
}
});
})
})
輸出
Readout all availiable Com Ports and their pnpID:
COM11
USB\VID_2341&PID_0043\75430333437351517211
Arduino LLC (www.arduino.cc)
COM9
USB\VID_2341&PID_0043\7543033343735151C020
Arduino LLC (www.arduino.cc)
COM8
USB\VID_2341&PID_0043\754363434303516181F0
Arduino LLC (www.arduino.cc)
COM7
USB\VID_2341&PID_0043\7543033313735140B152
Arduino LLC (www.arduino.cc)
COM4
USB\VID_2341&PID_0043\754303334373515162D0
Arduino LLC (www.arduino.cc)
open
open
open
open
open
data received: COM8 L03
data received: COM4 L01
data received: COM8 , -0.00127 , 8.19188
data received: COM4 , -
data received: COM7 L02
data received: COM4 0.00127 , 8.
data received: COM7 , -0.00
data received: COM4 19188
data received: COM7 127 , 8.
data received: COM9 L
data received: COM7 19188
從串口庫https://www.npmjs.com/package/serialport的文檔中
在遇到新行之前,可以選擇讀取數據。 可以使用它來代替baudRate以讀取整行數據。
更改以下行
var serialPort = new serialport.SerialPort(port.comName, {
baudrate: 9600
}, false);
至
var serialPort = new serialport.SerialPort(port.comName, {
parser: serialport.parsers.readline("\n")
}, false);
然后在你的回調中,數據將作為一個完整的行而不是碎片
編輯:
您應該創建一個處理服務器通信部分的收集器。 只需將其放在名為collector.js
的同一目錄中的另一個文件中即可。 然后主腳本會這樣工作:
var serialport = require('serialport');
var collector = require('./collector');
// list serial ports:
serialport.list(function (err, ports) {
console.log(" Readout all available Com Ports and their pnpID: ");
ports.forEach(function (port) {
console.log(port.comName);
console.log(port.pnpId);
console.log(port.manufacturer);
var serialPort = new serialport.SerialPort(port.comName, {
baudrate: 9600
}, false);
serialPort.open(function (error) {
if (error) {
return console.log('failed to open: ' + error);
}
console.log('open');
serialPort.on('data', function (data) {
console.log('data received: ' + port.comName + ' ' + data);
// add message to port message collection
collector.add(port.comName, data);
});
});
});
});
收藏家的工作方式如下:
var os = require('os');
var messages = {};
function checkAndSendData(key, data, message) {
if (data === os.EOL || message.match(/^L\d\d , \d,\d\d\d\d\d , \d\.\d\d\d\d\d$/)) {
// TODO: send data to server in formatted way, maybe need key?
return true;
}
return false;
}
module.exports = {
add: function(key, data) {
if (typeof messages[key] === 'undefined') {
messages[key] = '';
}
messages[key] += String(data);
if (checkAndSendData(key, data, messages[key])) {
messages[key] = '';
}
}
}
這有點長的評論..
serialPort.on('data', function(data) {
console.log('data received: ' + port.comName+ ' ' + data);
// switch(JSON.parse(data).type) { // if that's a possibility
if ("BEGIN" === data) {
console.log('begin data received: ' + port.comName+ ' ' + data);
}
});
我認為你要找的是一個復制的范例(工廠,讀者/作家?)但也許Begin,Stuff和End會對你有用嗎? 然后,您可以生成事件或調用您傳入的回調。
serialPort.on('data', function(data) {
console.log('data received: ' + port.comName+ ' ' + data);
// var _data = JSON.parse(data); // if that's a possibility
// switch(_data.type) {
// case "BEGIN": fnBegin(port.comName, _data.object); break;
// or
if ("BEGIN" === data) {
console.log('begin data received: ' + port.comName+ ' ' + data);
}
// or
factory.fn(port.comName, data);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.