如何在NodeJS中获取同步SerialPort读取

时间:2016-09-15 11:44:31

标签: node.js express arduino node-serialport

实际上正在开发一个自动机项目(基于Arduino< - > Serial< - > Raspberry),我似乎有点卡在串行接口上​​。

基本上,我使用Express以这种语法(http://localhost:3000/parameter/6http://localhost:3000/parameter/6/set?value=10)读取/写入arduino上的某个参数。

由于我愿意得到一个简单/简短的结果(作为API),我决定在每个请求上渲染一个简单的json对象,还有我没办法使用后期渲染脚本/用于此目的的Socket.io / jQuery / ...等框架(我可能经常从curl / wget / [其他html解析器调用这些网址])。

现在的问题是在端口上写入没有问题,但是为了阅读,我想在呈现页面之前等待从serialport.on('data', function(buffer) { ... })返回缓冲区

由于serialport.on('data', ... )似乎每个请求只调用一次,我目前发现的唯一方法是重定向到同一页面,直到缓冲区被读取,这似乎是一种讨厌完成任务的方式,也是不完整的......

以下是一些了解实际逻辑的代码:

图书馆:

// -> lib/serial.js - LIBRARY
var SerialPort = require("serialport");
var data = {'state': 0};


var serialPort = new SerialPort(port, {
  baudrate: 115200,
  parser: SerialPort.parsers.readline('\r\n'),
});

serialPort.on('open', function() {
  console.log('Serial port Open');
  serialPort.on('data', function(buffer) { data.buffer = buffer, data.state = 1 });
});

function readConfig(cmd, paramNb) {
  var cmd = String.fromCharCode(cmd);
  var param = String.fromCharCode(paramNb);
  if (serialPort.isOpen() == true) {
    serialPort.write(cmd + param + '\n', function(err) {
      if (err) {
        return console.log('Error on write: ', err.message);
      }
      console.log('message written');
    });
  }
  return data;
};

function writeConfig(cmd, paramNb, value) {
  var cmd = String.fromCharCode(cmd);
  var param = String.fromCharCode(paramNb);
  var value = String.fromCharCode(value);
  if (serialPort.isOpen() == true) {
    serialPort.write(cmd + param + value + '\n', function(err) {
      if (err) {
        return console.log('Error on write: ', err.message);
      }
      console.log('message written');
    });
  }
};

exports.readConfig = readConfig;
exports.writeConfig = writeConfig;

路线:

// -> parameter.js - ROUTE
var express = require('express');
var router = express.Router();
var serial = require('../../lib/serial');
var sleep = require('sleep');

/* SET Parameter. */
router.get('/:id/set', function(req, res) {
  var id = req.params.id;
  var value = req.query.value;
  serial.writeConfig('b', id, value);
  res.json({'result': value, 'id': id});
});

/* GET Parameter. */
router.get('/:id', function(req, res) {
  var id = req.params.id;
  var buffer = serial.readConfig('a', id);
  if (buffer.state != 0) {
    res.json({'result': buffer});
  }
  else {
    sleep.usleep(100000);
    res.redirect('/api/parameter/' + id);       // <- Nasty Bulls**t
  }
});

module.exports = router;

我想出的第一个想法是找到一种同步方式来读取端口,这样我就可以调用这样的东西(伪代码):

while (buffer == '') { var buffer = serial.read; }
res.json({buffer});

无论如何,谢谢大家。

0 个答案:

没有答案
相关问题