nodejs:http监听会干扰串行端口读取

时间:2019-01-02 21:04:32

标签: node.js serial-port

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

那么,为什么“听”阻止串行连接接收任何东西,除了每次服务请求时都会短暂?在没有它们相互干扰的情况下,我无法使用这两个功能吗?

1 个答案:

答案 0 :(得分:0)

我发现该代码可以在另一台计算机上按预期工作,即使另一台计算机使用的是完全相同的操作系统(Fedora 20)和已安装的完全相同的node.js版本(v10.15.0)以完全相同的方式(从源构建)。

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

这可能表明USB /串行驱动程序有些细微的差别,我没有时间,知识或需要研究。我只会使用我知道可以使用的配置。