我正在尝试使用serialport从Arduino读取数据,并将其提供给Web浏览器。
如果没有Web服务器(也就是说,如果我在末尾忽略了“listen”调用),串行数据就会不断地以控制台中显示的预期每秒5次更新流入。
但是,当我添加“listen”调用时,控制台上不会显示任何内容,除非我使用Web浏览器向服务器发出请求,此时控制台最多只能添加一个日志条目(但有时仍然不显示)。
Web浏览器中显示的数据是上次请求时的“旧”数据,而不是Arduino当前的最新数据。换句话说,串行数据被处理了一点
之后
每个HTTP请求都得到了服务-不是很有用。
const http = require('http');
const serialport = require('serialport');
var serial = new serialport('/dev/ttyUSB0', {
baudRate: 115200
});
var jsonStr = '';
var jsonObj = {};
function handleData(data) {
jsonStr += data;
if ( data.indexOf('}') > -1 ) {
try {
jsonObj = JSON.parse(jsonStr);
console.log(jsonObj);
}
catch(e) {}
jsonStr = '';
}
};
serial.on('data', function (data) {
handleData(data);
});
const app = http.createServer((request, response) => {
response.writeHead(200, {"Content-Type": "text/html"});
response.write(JSON.stringify(jsonObj));
response.end();
});
app.listen(3000);
(来自Arduino的数据已经是一个JSON字符串,这就是为什么我要寻找一个“”来开始解析它。)
我还尝试使用“可读”事件来获取串行数据,但这没有区别:
serial.on('readable', function () {
handleData(serial.read());
});
如果我理解正确,那么listen调用本身并没有阻塞,它只是注册一个事件侦听器/回调,以便稍后触发。正如一个相关问题的公认答案所说:“将server.listen(port)想象成与浏览器中的someElement.addEventListener(click,handler)有点相似。”
If node.js is single threaded then why does server.listen() return?
那么,为什么这种“监听”会阻止串行连接接收到任何东西,除了每次请求被发送时都要短暂地进行监听?如果这两个功能互不干扰,我是否无法使用它们?