实际上在做一个自动机项目(基于 Arduino <-> Serial <-> Raspberry),我似乎有点卡在串行接口上。
基本上,我使用 Express 通过 URL 以这种语法(http://localhost:3000/parameter/6或http://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});
总之谢谢大家。