【发布时间】:2018-04-30 16:35:52
【问题描述】:
我有一个 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'));
});
简而言之:我期待R1、R2 消息始终如一地进来,而不是像这样分开:
Data: <Buffer 52> R
Data: <Buffer 31 0d 0a> 1
我将 ("\r\n" / 0x0d 0x0a) 传递给 Readline。我错过了什么?
如何在节点中使用 SerialPort 获得一致的新行解析?
【问题讨论】:
-
我也是这么想的。我事先尝试了
parser: new Readline("\n"),但似乎没有什么不同。我将其设置为\r\n,因为这是我在数据缓冲区节点看到的(0d 0a)出于某种原因 -
嗯,可能是因为您在端口上附加了事件,而不是解析器?看例子:node-serialport.github.io/node-serialport/global.html#Parsers(这只是一个想法,我不确定这个,但是端口可能会接收块中的数据,而解析器尚未准备好或仍在等待数据)
-
@MatteoRagni 在解析器上添加“数据”侦听器有效。我想我可以通过在
SerialPort构造函数中指定解析器并直接在串行端口上侦听解析数据而摆脱困境。请在下面提供答案,以便标记。此外,如果您有任何建议来保持语法优雅,那就太棒了
标签: node.js arduino serial-port node-serialport