我正在尝试创建一个可以运行串行命令的交互式 CLI。我有两个文件 serialcomms.js 和 cli.js。Serialcomms.js 包含连接、处理程序和命令函数。cli.js 包含指挥官信息。
我的问题是我只能调用一次发送命令,因为侦听器/处理程序从串行通信文件中接管。循环 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)