我正在使用 node.js 的serialport2库从 arduino 接收串行数据。这就像一个魅力,但时不时地运行 pc 节点,由于EMI决定停用 USB 端口。尽管端口会立即再次激活,但串行端口会断开连接。Node.js 仍在运行,但从未恢复到 arduino 的串行连接。
使用串行端口的“关闭”事件,我希望节点在短暂延迟后重新连接到串行端口。到目前为止,这很好用:
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相当陌生,所以这很可能是一个菜鸟错误。我究竟做错了什么?有人可以指出我正确的方向吗?
(我知道我宁愿开始寻找干扰源,但是出于设备的可用性/处理原因,这种自动重新连接功能也会派上用场。)
谢谢