Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点Serialport:应用超时时,无法处理RxJS可观察的传入数据_Node.js_Rxjs_Serial Port_Node Serialport_Node Streams - Fatal编程技术网

Node.js 节点Serialport:应用超时时,无法处理RxJS可观察的传入数据

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()完成。 我能够实现上面提到的流程,但是需要做一些进一步的实现,比如 如果在给定时间段内未接收到数据,则超时 在出现超时或其他错误时重试发送命令 我正在进行超时实现,并尝试了和。应用任

我目前正在使用的NodeJS项目与。预期的“流程/用例”如下所示:

  • 串行端口的名称
    portName
    通过串行端口发送
  • 由于RxD和TxD相互链接,因此数据在硬件端“回显”
  • 数据通过串行端口读取
  • 传入的数据由处理并传递给
  • 如果读取的
    数据
    等于先前发送的
    端口名
    ,则不再需要可观测数据,将由
    observer.complete()完成。
  • 我能够实现上面提到的流程,但是需要做一些进一步的实现,比如

  • 如果在给定时间段内未接收到数据,则超时
  • 在出现超时或其他错误时重试发送命令
  • 我正在进行超时实现,并尝试了和。应用任何类型的超时功能时,数据似乎不会被串行端口读取/检索,这反过来会引发超时错误

    假设没有数据,乍一看这似乎很好,因为超时完成了它应该做的事情。但是,我能够通过不仅使用软件中的模拟串行端口,而且使用两个CP2102 USB到串行转换器(有关更多详细信息,请参阅代码中的注释),双重检查所需数据是否发送到端口:

    我错过了什么?为什么在不使用任何类型的超时时发送数据,而在应用超时功能时不发送数据


    因进一步调查而更新:

  • 当应用
    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);