繁体   English   中英

重新连接到端口后,node.js serialport事件停止工作

[英]node.js serialport events stop working after reconnecting to port

我正在使用用于node.js的serialport2库来从arduino接收串行数据。 这就像一个魅力,但PC运行节点时不时会由于EMI而决定停用USB端口。 尽管立即重新激活了端口,但Serialport断开了连接。 Node.js仍在运行,但从不恢复与arduino的串行连接。

我希望使用Serialport的“ closed”事件,在短暂的延迟后,让节点重新连接到串行端口。 到目前为止,这工作正常:

var SerialPort  = require('serialport2').SerialPort;
var arduinoPort = '/dev/arduino';

// setting up the serial connection
var arduinoSerial = new SerialPort();

var connectArd = function() {
  arduinoSerial.open(arduinoPort, {
    baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    flowControl: false
  });
}

connectArd();

// do something with incoming data
arduinoSerial.on('data', function (data) {
  .
  .
  .
});

// check for connection errors or drops and reconnect
var reconnectArd = function () {
  console.log('INITIATING RECONNECT');
  setTimeout(function(){
    console.log('RECONNECTING TO ARDUINO');
    connectArd();
  }, 2000);
};

arduinoSerial.on('close', function(){
  console.log('ARDUINO PORT CLOSED');
  reconnectArd();
});

arduinoSerial.on('error', function (err) {
  console.error("error", err);
  reconnectArd();
});

一旦出现EMI或USB电缆断开连接,“ arduinoSerial”的“关闭”侦听器就会启动,等待大约2秒钟,然后重新连接到arduino。 恢复连接,节点再次从arduino接收数据。

但是...这只能工作一次! 当发生第二次断开连接时,节点停止接收数据,但是由于某种原因,此时不会触发“关闭”事件。 我必须重新启动节点应用程序才能再次连接到arduino。

我对javascript相当陌生,因此这很可能是菜鸟的错误。 我究竟做错了什么? 有人能指出我正确的方向吗?

(我知道我宁愿开始寻找干扰源,但是由于设备的可用性/处理原因,这种自动重新连接功能也会派上用场。)

谢谢

感谢您的回答。 我能弄清楚。

var SerialPort  = require('serialport2').SerialPort;
var arduinoPort = '/dev/arduino';

// setting up the serial connection

var connectArd = function() {
  var arduinoSerial = new SerialPort();
  arduinoSerial.open(arduinoPort, {
    baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    flowControl: false
  });

  // do something with incoming data
  arduinoSerial.on('data', function (data) {
  .
  .
  .
  });

  arduinoSerial.on('close', function(){
    console.log('ARDUINO PORT CLOSED');
    reconnectArd();
  });

  arduinoSerial.on('error', function (err) {
    console.error("error", err);
    reconnectArd();
  });

}

connectArd();

// check for connection errors or drops and reconnect
var reconnectArd = function () {
  console.log('INITIATING RECONNECT');
  setTimeout(function(){
    console.log('RECONNECTING TO ARDUINO');
    connectArd();
  }, 2000);
};

我认为突破是调用var arduinoSerial = new SerialPort(); 每次重新连接。 我猜想这会(重新) arduinoSerial.on('close')侦听器,因此它们不会在arduinoSerial.on('close')事件中迷失arduinoSerial.on('close')

这些旧帖子出现在我的Google搜索上对我来说仍然很疯狂,但我认为我最好在这里为其他旅行者发布答案。

可接受答案的问题在于,由于每次都重新定义它们,因此您可能会超过Node设置的最大事件侦听器。 使用Node SerialPort 7.xx的最新版本,您可以简单地执行open()方法。 这是我已经测试并确认的一些示例代码。 我怀疑this.connected是否必要,因为SerialPort上可能有一种访问方法,但我只是用它来进行故障排除。 我也将此类用作超级类,因此其中还有一些用于处理不同类型解析器的逻辑,因此您也可以忽略它。

  connect() {
    return new Promise((resolve) => {
      this.serialPort = new SerialPort(this.port, { baudRate: this.baudRate, autoOpen: false });
      this.parser = this.serialPort.pipe(this.parser);

      this.serialPort.on('open', () => {
        this.connected = true;
      });
      this.serialPort.on('close', () => {
        this.connected = false;
        setTimeout(this.reconnect.bind(this), 5000);
      });
      this.serialPort.on('error', () => {
        setTimeout(this.reconnect.bind(this), 5000);
      });

      this.serialPort.open();

      resolve(this.parser);
    });
  }

  reconnect() {
    if (!this.connected) { this.serialPort.open(); }
  }
  • 打开连接之前,您不应该注册.on函数吗?

  • 这个babysitter似乎有一个模块

您不应该使用serialport2,因为它已经被弃用了一年多。 您应该改用节点串行端口 ,它的工作方式相同,可能会解决您的问题。

在serialport关闭事件中,应根据serialport.io调用arduinoSerial.resume()方法。

  arduinoSerial.on('close', function(){
    console.log('ARDUINO PORT CLOSED');
    arduinoSerial.resume();
    reconnectArd();
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM