代码之家  ›  专栏  ›  技术社区  ›  iforce2d

nodejs:HTTP侦听干扰serialport读取

  •  0
  • iforce2d  · 技术社区  · 6 年前

    我正在尝试使用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?

    那么,为什么这种“监听”会阻止串行连接接收到任何东西,除了每次请求被发送时都要短暂地进行监听?如果这两个功能互不干扰,我是否无法使用它们?

    1 回复  |  直到 6 年前
        1
  •  0
  •   iforce2d    6 年前

    我发现这段代码在不同的计算机上工作正常,即使另一台计算机使用的是完全相同的操作系统(Fedora 20)和完全相同的node.js版本(v10.15.0),而node.js的安装方式(从源代码构建)完全相同。

    我还发现它在最新版本的Fedora(29)的原始计算机上工作正常。

    这可能会指出USB/串行驱动程序中的一些细微差别,我没有时间、知识或需要深入研究。我只使用我知道可以工作的配置。