Javascript 数据流和带有serialport的Node.js

Javascript 数据流和带有serialport的Node.js,javascript,node.js,serial-port,Javascript,Node.js,Serial Port,我正在从事一个nodejs项目,该项目利用串行端口与微控制器进行通信。我可以用它来处理所有的事情,但我正在努力确定处理接收到的数据的最佳方法 以下是我正在测试的基本程序: const serialPort = require('serialport'); const delimiter = require('@serialport/parser-delimiter') const readline = require('readline'); const EventEmitter = requ

我正在从事一个nodejs项目,该项目利用串行端口与微控制器进行通信。我可以用它来处理所有的事情,但我正在努力确定处理接收到的数据的最佳方法

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

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();
}

对于流式传输任意数量数据的对象(即
解析器
对象可能有许多
数据
事件),您可能不希望使用承诺。一旦承诺得到解决,它就得到了永久解决(即,您只能将数据放入其中一次——通过设置
readAsync
,您似乎知道这一点)。您可能想尝试一种称为“可观察”的方法。您可以将observable连接到有问题的流,它会将它们排队等待以后的转换或使用(您可以将其视为可以接受多个数据项的承诺)。下面是一篇解释流(您当前使用的)和可观察对象如何进行互操作以获得更大的编程灵活性的文章


不幸的是,Node.js没有内置可观察的实用程序,但有一个规范的、经过战斗测试的解决方案。

有趣的是,我不知道可观察的东西。如果不先发送数据,则不应接收任何数据。本质上,我发送命令并接收响应。既然收到的数据是在一个已知的时间,我是否应该只处理单个事件?请参阅我的更新以了解我的预期用例。如果您只是来回打乒乓球,您可能只需要遵守承诺,但我只想确认,在一次
写入
事件之后,您不可能从uart接收多个
数据
事件。如果发生这种情况,您会希望将所有这些数据事件缓冲在一起,对吗?然后,只有在所有数据都被读取后才能解决承诺?再看一眼,即使乒乓球可以工作,基于我在你的代码中看到的一切,我敢打赌你仍然希望使用可观察到的东西来利用“反应”范式。您通过执行某些操作(打印到控制台、执行操作等)来“反应”接收到的每个换行符。是的,我不应该在意外的时间接收数据。我格式化来自MCU的数据,以便为广播vs响应数据添加一个标志,然后在parser.on数据中单独处理它。谢谢我将致力于实现可观性,并查看性能和可靠性是否存在差异。学习新东西总是很愉快的。谢谢你的意见。