1

シリアル コマンドを実行できる対話型 CLI を作成しようとしています。serialcomms.js と cli.js の 2 つのファイルがあります。Serialcomms.js には、接続、ハンドラー、およびコマンド関数が含まれています。cli.js にはコマンダ情報が含まれています。

私の問題は、リスナー/ハンドラーが serialcomms ファイルから引き継ぐため、send コマンドを 1 回しか呼び出せないことです。send コマンドを何度も呼び出すことができるように cli プログラムをループする最良の方法は何ですか? 子プロセスを使用する必要がありますか? または、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)
4

0 に答える 0