我使用node.js应用程序遇到了一个非常奇怪的问题。
该应用程序旨在接受来自Web应用程序的请求。页面上有一个显示“获取RFID”的按钮。使用此按钮,信号将发送到我的node.js服务器(Raspberry Pi)。树莓派打开与RFID阅读器的串行连接,并读取标签。标签读取后,Raspberry Pi会发回RFID标签。
这非常有效3次。 (按按钮,获取标签,刷新网站,按下按钮,获取标签,等等)。但是,在第4次尝试之后,node.js服务器立即关闭,传递标签的最后两个字母。
坠机期间的输出;显示标记的第三次扫描,该标记是成功的,然后是标记的第4次读取,导致应用程序崩溃。
user connected
open
debug - websocket writing 5:::{"name":"pong","args":["0F00DB3BF4\r"]}
info - booting client
info - transport end by forced client disconnection
debug - websocket writing 0::
info - transport end (booted)
debug - set close timeout for client 4G-HA1VgwTR54eNWaj3w
debug - cleared close timeout for client 4G-HA1VgwTR54eNWaj3w
debug - cleared heartbeat interval for client 4G-HA1VgwTR54eNWaj3w
debug - discarding transport
debug - client authorized
info - handshake authorized KSrkMxYYBNkXJO3Vaj3x
debug - setting request GET /socket.io/1/websocket/KSrkMxYYBNkXJO3Vaj3x
debug - set heartbeat interval for client KSrkMxYYBNkXJO3Vaj3x
debug - client authorized for
debug - websocket writing 1::
user connected
open
debug - websocket writing 5:::{"name":"pong","args":["F4\r"]}
info - booting client
info - transport end by forced client disconnection
debug - websocket writing 0::
info - transport end (booted)
debug - set close timeout for client KSrkMxYYBNkXJO3Vaj3x
debug - cleared close timeout for client KSrkMxYYBNkXJO3Vaj3x
debug - cleared heartbeat interval for client KSrkMxYYBNkXJO3Vaj3x
debug - discarding transport
Aborted
代码如下;
GNU nano 2.2.6 File: nocoin.js
// Socket.io server details
var io = require('socket.io').listen(3000);
// Serialport plugin declared and made a serialport variable
var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
// Variable containing technical USB port details
var serialPort = new SerialPort("/dev/ttyUSB0", {baudrate: 2400, parser: serialport.parsers.readline("\n")}, false); // this is the openImmediately flag [default is true]
io.sockets.on('connection', function (socket) {
console.log('user connected');
socket.on('ping', function (data) {
serialPort.open(function () {
// Open notification
console.log('open');
//Start listening
serialPort.on('data', function(data) {
// If content is empty, filter out
if (data.trim() !== '') {
socket.emit('pong', data);
socket.disconnect();
//Execute function again, get tag, handle tag and end process
serialPort.flush(function(err) {
setTimeout(function() {
serialPort.close(function(err) { });
}, 10);
});
}
});
});
});
});
我可能在这里做错了什么? node.JS是否需要刷新缓冲区?为什么它会在第4次尝试后立即崩溃?
答案 0 :(得分:0)
首先,你忽略了错误。 (serialPort.close(function(err) { });
)始终处理错误 - 您还可以如何诊断错误?
其次,为什么不保持串行连接持续打开并向所有连接的客户端发送数据?
var serialPort = new SerialPort("/dev/ttyUSB0", {baudrate: 2400, parser: serialport.parsers.readline("\n")});
serialPort.on('data', function(data) {
io.sockets.emit('tag', data);
});
更简单。