0

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

基本上,我使用 Express 通过 URL 以这种语法(http://localhost:3000/parameter/6http://localhost:3000/parameter/6/set ? 值 = 10)。

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

现在问题是在端口上写入没有问题,但是对于读取,我想在渲染页面之前等待缓冲区返回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});

总之谢谢大家。

4

0 回答 0