gpt4 book ai didi

node.js - nodejs-serialport => 关闭后重新建立与端口的连接

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:14 24 4
gpt4 key购买 nike

根据我的上一个问题SerialPort 'close' event never fire 。我无法检测 COM 是否已断开连接,因此我创建了自己的方法来检测它。

我已经创建了时间戳,并每 1 秒使用 interval() 检查一次,看看它是否已连接。当检测到 COM 已拔出时,我尝试使用 SerialPort 重新建立连接或重新实例端口,就像您在下面的代码中看到的那样。

当尝试重新连接时,我收到错误:访问被拒绝。

有办法刷新或清理缓存吗? ,因为我认为服务器在未正确关闭时仍然保持连接。

我也尝试过port.close(),但它把我抛出了:错误:端口未打开。

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);
})

谢谢!

最佳答案

正如您在 /node_modules/serialport/lib/serialport.js 中看到的: close - 可能不会发出事件(与 disconnect 不同) )。

您可以像下面这样在本地添加 console.log 来进行简单调试。

附注我在 Win7x32 上测试了它。 关闭-发出事件。

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

关于node.js - nodejs-serialport => 关闭后重新建立与端口的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46307803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com