【问题标题】:NodeJS serial port value reading issueNodeJS 串口值读取问题
【发布时间】:2017-12-19 12:44:35
【问题描述】:

我是 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. 向我创建的网站发送价值。

我确实尝试使用这个 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 与串行端口一起使用。任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    我找到了问题的答案。

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

    Serial Port 中有一个文本逐行读取的概念,叫做 Parsers。这也解决了我的问题。

    var serialPort = new SerialPort("/dev/ttyACM0", {
        autoOpen: false,
        parser: SerialPort.parsers.readline('\n'),
        baudrate:115200
    }); 
    

    像这样更改代码是可行的,因为现在它正在尝试逐行读取。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您好,感谢您的贡献。为了获得更好的结果,请尝试解释 OP 的知识以及代码中修复的问题。也最好提供参考以供进一步阅读。
      猜你喜欢
      • 1970-01-01
      • 2011-08-27
      • 2023-03-20
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2018-04-18
      • 2011-05-06
      相关资源
      最近更新 更多