2017-09-19 213 views
0

根據我的最後一個問題SerialPort 'close' event never fire。我無法檢測到COM是否已斷開,因此我創建了自己的方式來檢測它。nodejs-serialport =>重新建立連接後關閉端口

我已經創建了時間戳,並每隔1秒用​​進行檢查,看它是否已連接。 當它檢測到COM被拔掉我已嘗試重新建立連接或重新實例端口SerialPort,就像你會看到下面的代碼。

當它嘗試重新連接我已經得到Error: Access denied.

有一種方法來刷新或清理緩存? ,因爲我認爲服務器在沒有正常關閉時仍然保持連接。

我也試過port.close(),它是把我扔出去:Error: Port is not open.

var comPort = '\\\\.\\COM7', 
    lastDataTime, 
    lastresult, 
    count = 0, 
    lastDataTime, 
    comStatus, 
    error; 
var port = new SerialPort(comPort, function (err) { 
    if (err) { 
     comStatus = false; 
     return console.log('Error: ', err.message); 
    } 
}); 
const parser = port.pipe(new Readline()); 
port.on('open', function() { 
    console.log('~Port is open.'); 

    parser.on('data', function (data) { 
     comStatus = true; 
     lastDataTime = Date.now(); 
     if (++count == 10) { 
      count = 0; 
      lastresult = data; 
     } 
    }); 
}); 

setInterval(function() { 
    if (Date.now() - lastDataTime > 1000 || !comStatus) { 
     comStatus = false; 
     port.close(); 
     port = new SerialPort(comPort, function (err) { 
      if (err) { 
       error = 'Error: ' + err.message; 
       return console.log(error); 
      } 
     }); 
    } 
}, 1000); 


app.get('/', function (req, res) { 
    res.send((comStatus) ? lastresult : 'Disconnected - ' + error); 
    console.log(lastresult); 
}) 

謝謝!

回答

2

正如您在/node_modules/serialport/lib/serialport.js中看到的:close - 可能不會發射事件(與disconnect不同)。

你可以像下面這樣在本地添加console.log來簡單調試。

P.S.我在Win7x32上測試過它。 Close - 發生事件。

SerialPort.prototype._disconnected = function(err) { 
    this.paused = true; 
    this.emit('disconnect', err); 

    // add: console.log('1', this.closing); 

    if (this.closing) { 
    return; 
    } 

    // add: console.log('2', this.fd); 

    if (this.fd === null) { 
    return; 
    } 

    this.closing = true; 
    if (process.platform !== 'win32') { 
    this.readable = false; 
    this.serialPoller.close(); 
    } 

    // add: console.log('3'); 

    SerialPortBinding.close(this.fd, function(err) { 
    // add: console.log('4', this._events.close.toString()); 

    this.closing = false; 
    if (err) { 
     debug('Disconnect close completed with error: ', err); 
    } 
    this.fd = null; 
    this.emit('close'); // it's your target 
    }.bind(this)); 
}; 

重新連接例如

var SerialPort = require('serialport'); 
var port = new SerialPort('COM1', {autoOpen: false, baudRate: 9600}); 

function open() { 
    port.open(functon (err) { 
     if (!err) 
      return; 

     console.log('Port is not open: ' + err.message); 
     setTimeout(open, 10000); // next attempt to open after 10s 
    }); 
} 

port.on('open', function() { 
    function send() { 
     if (!port.isOpen()) // v5.x require 
      return console.log('Port closed. Data is not sent.'); 

     port.write(123, function (err) { 
      if (err) 
       console.log('Error on write: ' + err.message) 

      port.drain(() => console.log('DONE')); 
     }); 
    } 

    setInterval(send, 1000); 
}); 

port.on('close', function() { 
    console.log('CLOSE'); 
    open(); // reopen 
}); 

port.on('data', (data) => console.log('Data: ' + data)); 
port.on('error', (err) => console.error('Error: ', err.message)); 

open(); // open manually 
+0

由於該事件火我已經嘗試重新連接'COM'之後,但之後幫助!我再重新連接數據停止流動。 你知道如何斷開連接後重新連接嗎? – itzikb

+0

使用'autoOpen:false'選項並手動打開端口。 –

相關問題