Node.JS应用程序在第4次使用后退出

时间:2014-06-03 20:34:06

标签: javascript node.js raspberry-pi rfid

我使用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次尝试后立即崩溃?

1 个答案:

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

更简单。