gpt4 book ai didi

javascript - 带串口的数据流和 Promises Node.js

转载 作者:太空宇宙 更新时间:2023-11-03 22:07:12 24 4
gpt4 key购买 nike

我正在开发一个 Nodejs 项目,该项目利用串行端口与微 Controller 进行通信。我可以使用 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;
}

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

更新

我计划导出一个用于写入串行端口的函数,该函数在收到数据后履行 promise 。

示例:

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

最佳答案

对于传输任意数量数据的对象(即,parser 对象可能有许多data 事件),您可能不想使用 Promise。一旦 promise 得到解决,它就会永久解决(即,您只能将数据放入其中一次 - 看起来您通过设置 readAsync 的方式知道这一点)。您可能想尝试一种称为 Observable 的东西。您可以将可观察量连接到相关流,它会将它们排队以供以后转换或使用(您可以将其视为可以接受多个数据项的 promise )。这是good SO answer解释流(您当前使用的内容)和可观察量如何互操作以获得更大的编程灵 active 。

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

关于javascript - 带串口的数据流和 Promises Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52186691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com