NodeJS串口值读取问题

时间:2017-12-19 12:44:35

标签: node.js mongodb socket.io arduino serial-port

我是Node.JS和Arduino的新手。我有一个Arduino设置和几个传感器。我正在用Arduino读取温度和湿度值。我的串口监视器输出如下:

Humiditiy (%): 44.00
Temperature (Celcius): 26.00
Temperature (Kelvin): 299.00
Temperature (Fahrenheit): 58.00
Gas Value: 341

Humiditiy (%): 44.00
Temperature (Celcius): 26.00
Temperature (Kelvin): 299.00
Temperature (Fahrenheit): 58.00
Gas Value: 341

我想要三件事:

  1. 使用NodeJS并拉动串行监视器输出。
  2. 使用MongoDB存储值
  3. 将值发送到我创建的网站。
  4. 我尝试使用此NodeJS文件从串行监视器中提取值,并将输出放到控制台。

    // Setup basic express server
    var express = require('express');
    var app = express();
    var server = require('http').createServer(app);
    var io = require('socket.io')(server);
    
    // Routing
    var SerialPort = require("serialport").SerialPort
    var serialPort = new SerialPort("/dev/ttyACM0", {
        baudrate:115200
    }, false); // this is the openImmediately flag [default is true]
    
    serialPort.open(function () {
      serialPort.on('data', function(data) {
        console.log('Receiving data' + data);
      });
    });
    

    但是终端的输出很奇怪,但这是我得到的最佳输出。

    Receiving dataty (%)
    Receiving data: 44.00
    Temperature (Celcius): 26.00
    Temperature 
    Receiving data(Kelvin): 299.00
    Temperature (Fahrenheit): 58.00
    Receiving data
    
    Receiving dataz
    Receiving dataas Value: 380
    

    现在我正在研究如何将Mongo与串口一起使用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我找到了问题的答案。

上面发布的程序的实现方式,serialport将尽可能快地发送'数据'事件。在触发“数据”事件之前,它不会等待接收完整的文本行,这是我认为您期望的。如果Arduino草图以115200波特率尽快输出信息,那么Node.js程序在尝试开始读取时会遇到困难。也许这就是问题所在。 Node.js程序和Arduino应该协调他们的沟通。

串行端口中有一个逐行概念的文本读取,称为解析器。这也解决了我的问题。

OVERLAPPED

更改这样的代码是有效的,因为现在它正在尝试逐行阅读。

答案 1 :(得分:0)

以下代码适用于最新的串行端口libray更改

var serialport = require('serialport');
serialport.list(function (err, ports) {

    ports.forEach(function(port) {
    console.log(port.comName);
    });
});
var portName="COM1";
var myPort = new serialport(portName, 9600);
var Readline = serialport.parsers.Readline; // make instance of Readline parser
var parser = new Readline(); // make a new parser to read ASCII lines
myPort.pipe(parser); // pipe the serial stream to the parser
myPort.on('open', showPortOpen);
parser.on('data', readSerialData);
function showPortOpen(){
    console.log("Port opened");
}

function readSerialData(data){
    console.log("data received "+data);
}