为什么节点SerialPort Readline解析器不工作?

时间:2018-04-30 16:35:52

标签: node.js arduino serial-port node-serialport

我有一个Arduino发送非常基本的消息:

Serial.print('R');
Serial.println(1);

Serial.print('R');
Serial.println(2);

我正在尝试使用node.js和SerialPort模块读取每一行,但结果不一致:

Data: <Buffer 52 31 0d 0a> R1

Data: <Buffer 52 32 0d 0a> R2

Data: <Buffer 52 31 0d 0a> R1

Data: <Buffer 52 32 0d 0a> R2

Data: <Buffer 52 31 0d 0a> R1

Data: <Buffer 52 32 0d 0a> R2

Data: <Buffer 52 31 0d 0a> R1

Data: <Buffer 52 32 0d 0a> R2

Data: <Buffer 52> R
Data: <Buffer 31 0d 0a> 1

Data: <Buffer 52 32 0d 0a> R2

这就是我试图解析的方式:

this.port = new SerialPort(portName, {
            baudRate: baudRate,
            autoOpen:false,
            flowControl: false,
            parser: new Readline("\r\n")
        });

        this.port.open(function (err) {
            if (err) {
                return console.log('Error opening port: ', err.message);
            }

            console.log("port open!");

        });

        this.port.on('error', function(err) {
            console.log('Error: ', err.message);
        })

        this.port.on('open', function() {
            console.log("open event called");
        });

        this.port.on('data', function (data) {
            console.log('Data:', data,data.toString('utf8'));
        });

简而言之:我希望R1R2消息始终如一,而不是像这样分开:

Data: <Buffer 52> R
Data: <Buffer 31 0d 0a> 1

我正在("\r\n" / 0x0d 0x0a)传递给Readline。我错过了什么? 如何在节点中使用SerialPort获得一致的新行解析?

1 个答案:

答案 0 :(得分:2)

我认为您的问题的解决方案需要在parser对象上绑定事件,而您当前正在port对象上侦听它。通过端口到达的数据并不总是由0x0d 0x0a(*)终止。这两个字节只是ReadLine解析器的字符串终止符信号。

因此,也许您应该在代码中编写此侦听器:

// I'm not actually sure where parser lives, I'm not
// in the condition of trying by myself...
this.port.parser.on('data', function (data) {
  console.log('Data:', data,data.toString('utf8'));
});

不幸的是,我没有任何建议使语法更优雅,对于我的标准,这个解决方案比创建一个为您重定向绑定的功能更优雅。这取决于您的应用程序,目前我没有足够的信息来建议可能的更好的解决方案。

(*)在我立即删除的第一个(错误的)评论中,我问为什么你把两个字节都作为终止0x0d 0x0a (\r\n),而不仅仅是0x0a (\n)而是Serial.println }方法实际上默认写入两个字节。