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

我正在使用node.js的serialport2库来接收来自arduino的串行数据。 这工作像一个魅力,但时不时PC运行节点,决定停用USB端口,由于EMI 。 所有的端口再次被激活,串口掉线。 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”的“closures”监听器就会踢,等待约2秒钟,重新连接到arduino。 连接恢复,节点再次接收来自arduino的数据。

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

我相当新的JavaScript,所以这可能是一个菜鸟的错误。 我究竟做错了什么? 有人能指点我的方向吗?

(我知道我应该开始寻找干扰的来源,但是这种自动重新连接function也会出于设备的可用性/处理原因而派上用场。)

谢谢

感谢您的回答。 我可以弄明白。

 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(); 每次重新连接。 我想这(重新)attatches的听众,所以他们不会迷失在arduinoSerial.on('close')事件。

  • 在打开连接之前不应该注册.on函数吗?

  • 这个babysitter似乎有一个模块

你不应该使用serialport2,因为它已经过时了。 您应该使用节点串行端口 ,它的工作方式相同,可能会解决您的问题。