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