数据流和使用串行端口承诺Node.js

时间:2018-09-05 13:44:50

标签: javascript node.js serial-port

我正在研究一个nodejs项目,该项目利用串行端口与微控制器进行通信。我可以使用serialport来使一切正常工作,但是我正在努力确定处理接收到的数据的最佳方法。

这是我正在测试的基本程序:

const serialPort = require('serialport');
const delimiter = require('@serialport/parser-delimiter')

const readline = require('readline');
const EventEmitter = require('events');

const rl = readline.createInterface({
  input: process.stdin, 
  output: process.stdout
});

rl.setPrompt('> ');
rl.prompt();

const uart = new serialPort('path-to-port', {
  baudRate: 9600
});

const parser = uart.pipe(new delimiter({ delimiter: '\n'}));

const event = new EventEmitter();

parser.on('data', (data) => {
  event.emit('dataReady', data);
});

rl.on('line', (input) => {
  if(input === 'close'){
    console.log('Bye');
    process.exit();
  }

  uart.write(input + '\n', (err) => {
    if (err) {
      console.log('uart write error');
    }
  });

  console.log('Waiting on data...');
  readAsync().then((data) => {
    console.log(' ->', data.toString());
    rl.prompt();
  });


});

const readAsync = () => {
  const promise = new Promise((resolve, reject) => {
    event.once('dataReady', (data) => {
      resolve(data);
    });
  });

  return promise;
}

我想返回一个承诺,一旦收到数据,该承诺就会兑现。目前,我正在发出一个事件,并使用侦听器来实现承诺。这是最好的方法还是更好的选择?

更新

我计划导出一个写入串口的函数,一旦接收到数据,该函数就可以实现承诺。

示例:

module.exports.write = (cmd) => {
  uart.write(input + '\n', (err) => {
    if (err) {
      console.log('uart write error');
    }
  });
  return readAsync();
}

1 个答案:

答案 0 :(得分:0)

对于某些流式传输任意数量的数据(即parser对象可能具有许多data事件)的情况,您可能不想使用promise。兑现承诺后,它就会永久解决(即,您只能将数据放入其中一次-就像您通过设置readAsync所知道的那样)。您可能想尝试一种称为Observable的方法。您可以将可观察对象连接到有问题的流,它将把它们排成队列以便以后进行转换或使用(您可以将其视为可以接受多个数据项的承诺)。这是good SO answer的解释,说明了流(当前使用的流)和可观察变量如何互操作以实现更大的编程灵活性。

不幸的是,Node.js没有内置的Observable实用程序,但是有一个经过实践检验的规范解决方案RxJS