数据流处理程序和CLI合并Node JS

时间:2018-08-09 17:31:04

标签: javascript node.js serial-port node-commander

我正在尝试创建一个可以运行串行命令的交互式CLI。我有两个文件serialcomms.js和cli.js。 Serialcomms.js包含连接,处理程序和命令功能。 cli.js包含指挥官信息。

我的问题是我只能调用一次send命令,因为侦听器/处理程序会接管serialcomms文件。什么是循环cli程序的最佳方法,以便我可以一遍又一遍地调用send命令,但仍然运行串行处理程序并将其输出到stdout?我需要使用子进程吗?还是递归调用cli本身?

我期望在串行线另一端有一个回声机器人的示例行为。

  • 发送问候
  • 你好
  • 再见
  • 再见

我遇到的行为

  • 发送问候
  • 你好
  • 无尽的等待

这是我的serialcomms.js

const SerialPort = require('serialport');
const ReadLine = require('@serialport/parser-readline');

let portName = `/dev/pts/${process.argv[2]}` || '/dev/pts/6';
let baudRate = process.argv[3] || 115200;


let myPort = new SerialPort(portName, {baudRate: baudRate})
let parser = myPort.pipe(new ReadLine({ delimiter: '\n' }))

myPort.on('open', () => {
    console.log(`port ${portName} open`)
  })

  parser.on('data', (data) => {
    console.log(data)
  })

  myPort.on('close', () => {
    console.log(`port ${portName} closed`)
  })

  myPort.on('error', (err) => {
    console.error('port error: ' + err)
  })



function send(data){
    myPort.write(JSON.stringify(data)+'\n', function(err) {
        if (err) {
          return console.log('Error on write: ', err.message);
        }
        console.log(`${data} sent`);
      });
}

module.exports = {
    send
}

这是我的CLI.js文件

const program = require('commander');
const {send} = require('./serialcomms');

program
    .version('1.0.0')
    .description('Serial Tester')

program
    .command('send <msg>')
    .alias('s')
    .description('send a message over serial')
    .action((msg)=>{
        send(msg)
    })

program.parse(process.argv)

0 个答案:

没有答案