使用Node.Js读取多个串行input

我一直在做一个简单的脚本来监视我实验室里的6个arduino单元。 我似乎已经差不多了!

我目前的问题是让每个数据集很好地捆绑在一个string中。 实际上,我可以打开与所有串行端口的连接,接收它们的数据,但是没有将代码块组织到捆绑包中。 我已经考虑尝试做一个临时数组来附加块,或者产生subprocess。 但是,我在subprocess方面遇到了困难,不知道如何以适当的方式构造一个数组。 一旦我有捆绑的string,我将发送到我的服务器上的数据库。 我确实有这种感觉,我可能会以一种不恰当的方式来做这件事,任何的build议都是非常好的!

PS:你可能会注意到只有5个arduino显示,这只是为了让事情稍微复杂一些,因为第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

有一个选项来读取数据,直到遇到新行。 这可以用来代替波特率来读取整行数据。

更改以下行(S)

 var serialPort = new serialport.SerialPort(port.comName, { baudrate: 9600 }, false); 

 var serialPort = new serialport.SerialPort(port.comName, { parser: serialport.parsers.readline("\n") }, false); 

然后在你的callback中,数据将成为一个完整的行,而不是片段

编辑:

你应该做一个收集器,然后处理服务器通信部分。 只需将其放置在另一个文件中,名称为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); }); }); }); }); 

collections家会像这样工作:

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

我认为你要找的是一个复制的范例(Factory,Reader / Writer?),但也许Begin,Stuff和End会适合你? 然后,您可以生成事件或调用您通过的callback。

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