Node.js 节点Serialport:应用超时时,无法处理RxJS可观察的传入数据
我目前正在使用的NodeJS项目与。预期的“流程/用例”如下所示:Node.js 节点Serialport:应用超时时,无法处理RxJS可观察的传入数据,node.js,rxjs,serial-port,node-serialport,node-streams,Node.js,Rxjs,Serial Port,Node Serialport,Node Streams,我目前正在使用的NodeJS项目与。预期的“流程/用例”如下所示: 串行端口的名称portName通过串行端口发送 由于RxD和TxD相互链接,因此数据在硬件端“回显” 数据通过串行端口读取 传入的数据由处理并传递给 如果读取的数据等于先前发送的端口名,则不再需要可观测数据,将由observer.complete()完成。 我能够实现上面提到的流程,但是需要做一些进一步的实现,比如 如果在给定时间段内未接收到数据,则超时 在出现超时或其他错误时重试发送命令 我正在进行超时实现,并尝试了和。应用任
portName
通过串行端口发送数据
等于先前发送的端口名
,则不再需要可观测数据,将由observer.complete()完成。
因进一步调查而更新:
timeout()
时,数据在超时持续时间之后发送,这意味着超时会触发发送数据和退出可观察对象,因为超时了。因此,.timeout()
似乎并不应用于返回的Rx.Observable
,而是应用于整个函数myObservable
我是否正确地理解了您的代码在最后将超时设置为unsubscribe之前是完全按照预期工作的?看起来超时不是应用于可观察的,而是应用于返回可观察的完整函数。这不是期望的行为,因为数据是使用相同的函数发送的。因此,数据应该发送到串行设备,等待传入数据/应答直到超时。我指的是
setTimeout
。让我们先忘掉observable函数中的timeout
操作符,如果不设置取消订阅的超时,代码是否能按预期工作?如果没有任何类型的超时,任何东西都能按预期工作。在我的问题中,带有注释行的代码做了它应该做的事情,并且是进一步超时实现的基础。
'use strict';
const Rx = require('rxjs');
const { interval } = require('rxjs');
const { timeout } = require('rxjs/operators');
const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
// `tries` is needed for later implementation of communcation retries
const myObservable = (portName, tries) => {
const port = new SerialPort(portName);
const parser = port.pipe( new Readline() );
port.write(`${portName}\n`);
return Rx.Observable
.create( (observer) => {
parser.on('data', (data) => {
observer.next(data);
console.log(`Detection will be: ${data == portName} (${data} vs. ${portName})`);
if (data == portName)
{
port.close( (err) => {
if (err)
{
console.log(`Error on closing serial port: ${err}`);
observer.error(err);
}
});
observer.complete();
}
})
})
// `timeout` is needed for later implementation of communication timeout, see comment at end of code
// .pipe(timeout(10000))
}
const myObserver = {
next: x => console.log(`got data from observable: ${x}`),
error: err => console.error(`something wrong occurred: ${err}`),
complete: () => console.log('done'),
};
console.log('before subscribe');
const sub = myObservable('/dev/tty.usbserial-FTG7L3FX', null).subscribe(myObserver);
// double-checked that data is sent by using software (created an emulated pair of virtual serial ports with `socat -d -d pty,raw,echo=0 pty,raw,echo=0`)
// --> data is sent, but not read/retrieved when either using `setTimeout` or RxJS' own `timeout()`
// const sub = myObservable('/dev/ttys003', null).subscribe(myObserver);
// double-checked that data is sent by using hardware interfaces (used two CP2102 modules with pairwise-crossed RxD and TxD)
// --> data is sent, but not read/retrieved when either using `setTimeout` or RxJS' own `timeout()`
// const sub = myObservable('/dev/tty.SLAB_USBtoUART', null).subscribe(myObserver);
console.log('after subscribe');
// when commenting the following `setTimeout()` data is retrieved, but does not work with `setTimeout()`
// so tried to use RxJS' `timeout()` operator --> not working either
// setTimeout(() => {
// sub.unsubscribe();
// console.log('unsubscribed');
// }, 10000);