客观
我需要通过串行端口获取数据以获取诸如
之类的命令
写入序列:“命令”
来自串行接收器的预期响应:十六进制值
,我用了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
的输出请帮助我接收完整的缓冲区数据,而不是随机字节。
答案 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);