我正在尝试使用serialport从arduino读取数据,并将其提供给网络浏览器。
在没有网络服务器的情况下(即,如果我在末尾没有进行“侦听”呼叫),串行数据将不断地以每秒显示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());
});
如果我正确理解,则监听调用本身并没有阻塞,它仅注册了一个事件监听器/回调,以便稍后触发。在一个相关问题中一个公认的答案是:“认为server.listen(port)有点类似于浏览器中的someElement.addEventListener('click',handler)。”
If node.js is single threaded then why does server.listen() return?
那么,为什么“听”阻止串行连接接收任何东西,除了每次服务请求时都会短暂?在没有它们相互干扰的情况下,我无法使用这两个功能吗?
答案 0 :(得分:0)
我发现该代码可以在另一台计算机上按预期工作,即使另一台计算机使用的是完全相同的操作系统(Fedora 20)和已安装的完全相同的node.js版本(v10.15.0)以完全相同的方式(从源构建)。
我还发现它在使用最新版本的Fedora(29)的原始计算机上可以正常工作。
这可能表明USB /串行驱动程序有些细微的差别,我没有时间,知识或需要研究。我只会使用我知道可以使用的配置。