serialport node.js读取缓冲区问题

时间:2019-03-16 07:10:52

标签: node-serialport

客观
我需要通过串行端口获取数据以获取诸如
之类的命令
写入序列:“命令”
来自串行接收器的预期响应:十六进制值

,我用了Serial Port 包。


serial.js

var serialport = require('serialport');
var Readline = serialport.parsers.Readline; // make instance of Readline parser
var parser = new Readline(); // make a new parser to read ASCII lines


// list serial ports:
serialport.list(function (err, ports) {
    ports.forEach(function (port) {
        console.log("Serial Device: " + port.comName);
    });
});

// get port name from the command line:
var path = '/dev/cu.SLAB_USBtoUART' ;

var myPort = new serialport(path ,{
    baudRate: 230400,
});

// Read Line Parser
myPort.pipe(parser); // pipe the serial stream to the parser


// Handling Events
myPort.on('open', showPortOpen);
// Calling with set interval
setInterval(writeToSerial, 2000);
myPort.on('data', readSerialData);
myPort.on('close', showPortClose);
myPort.on('error', showError);

// Callback Functions
function showPortOpen() {
    console.log('port open. Data rate: ' + myPort.baudRate);
}


function writeToSerial() {
    myPort.write('?1VB');
}

function readSerialData(data) {
    buff = data;
    console.log(data);
}

function showPortClose() {
    console.log('port closed.');
}

function showError(error) {
    console.log('Serial port error: ' + error);
}

上面的代码基本上是使用setInterval(function(){},time)设置端口并将数据写入串行端口,然后是读取数据事件及其回调函数。读取数据事件运行良好,但接收到的数据以缓冲区的形式出现,并且在读取数据时会分解成块。这是附件Output

的输出

请帮助我接收完整的缓冲区数据,而不是随机字节。

2 个答案:

答案 0 :(得分:0)

串行端口正确接收0x0c,0xda,0x0c,0xda等的重复值(十六进制)。

因为您有myPort.on('data', readSerialData);,并且readSerialData直接输出到控制台,所以它显示为<Buffer 0c da>,因为这是接收到的内容,并且该字符串是打印时处理Buffer对象的方式。

内置parsers可以处理不同的传入格式(例如,仅在收到换行符时或在一定数量的特定字节之后才发出数据)。

根据您要执行的操作,可以使用这些解析器之一,或者如果它们不满足您的需求,则只需将数据推入新的数组,缓冲区或其他对象中以供以后处理。

如果您想对那些十六进制值做些事,已经发布了很多问题,例如convert buffer to array和Node文档本身,非常方便。

答案 1 :(得分:0)

数据已作为字节缓冲区输出,因为您已将readSerialData事件处理程序订阅到该端口,而不是将其订阅到解析器。另请参见Serialport documentation on Parsers

您只需替换以下行即可对其进行修复:

myPort.on('data', readSerialData);

使用

parser.on('data', readSerialData);