[英]Data Stream and Promises Node.js with serialport
我正在研究一個利用串行端口與微控制器通信的nodejs項目。 我可以使用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;
}
我想返回一個承諾,一旦收到數據,該承諾就會兌現。 目前,我正在發出一個事件,並使用偵聽器來實現承諾。 這是最好的方法還是有更好的選擇?
更新
我計划導出一個寫入串口的函數,一旦接收到數據,該函數即會兌現承諾。
例:
module.exports.write = (cmd) => {
uart.write(input + '\n', (err) => {
if (err) {
console.log('uart write error');
}
});
return readAsync();
}
對於流式傳輸任意數量數據的事物(即, parser
對象可能具有許多data
事件),您可能不想使用promise。 諾言一旦解決,便readAsync
解決(即,您只能將數據放入其中一次-通過設置readAsync
的方式就可以知道)。 您可能想嘗試一種稱為Observable的方法。 您可以將可觀察對象連接到有問題的流,它將把它們排成隊列以便以后進行轉換或使用(您可以將其視為可以接受多個數據項的承諾)。 這是一個很好的SO答案,它說明了流(當前正在使用的)和可觀察變量如何互操作以實現更大的編程靈活性。
不幸的是,Node.js沒有內置的Observable實用程序,但是有一個經過實踐檢驗的規范解決方案RxJS 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.