在node.js中重新加载网页后读取多个Serialport

在node.js中重新加载网页后读取多个Serialport,node.js,node-serialport,Node.js,Node Serialport,我正在尝试在Raspberry Pi上使用node.js来连接串行设备。我想将数据从设备发送到网页,将控制数据从网页发送到设备,并在Pi上记录和存储数据。 当我运行此命令时: var fs = require('fs'); var http = require('http'); var server = http.createServer(function(req, res){ res.writeHead(200, { 'Content-type': 'text/html'});

我正在尝试在Raspberry Pi上使用node.js来连接串行设备。我想将数据从设备发送到网页,将控制数据从网页发送到设备,并在Pi上记录和存储数据。 当我运行此命令时:

var fs = require('fs');
var http = require('http');
var server = http.createServer(function(req, res){
    res.writeHead(200, { 'Content-type': 'text/html'});
    res.end(fs.readFileSync(__dirname + '/engComp.html'));
    }).listen(8080, function(){console.log('Listening at: http://localhost:8080');});
var io = require('socket.io').listen(server);
var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
var sp = new SerialPort("/dev/ttyAMA0", {
    baudrate: 9600,parser: serialport.parsers.readline('\r')});

sp.open(function (){console.log('serial port open');
    io.on('connection', function (socket){
        console.log('socket open');
        socket.on('data',function(recData){   //data recieved from socket
            console.log('http rec data = '+recData);
            sp.write(recData, function(err, results){
                console.log('serial port send data = '+recData);
            });
        });
        sp.on('data', function(sdata){        //data recieved from serial port
            console.log('serial port rec sdata = ' + sdata);
        });
        socket.on('disconnect', function (){
            console.log('socket disconnect');
//            sp.close(function(){
//                console.log('serial port closed');
//            });
        });
    });
});
然后重新加载页面,比如说3次,每次读取串行数据,我会得到3个输出

如果我将sp.close()放回(取消rem),它将一直工作,直到我按预期重新加载为止(端口已关闭,但从未重新打开)

如果我将sp.open()放在io.on(连接)回调中,并且在重新加载页面时(在sp.close()之后,但在sp.open()之前),串行数据进入,它会崩溃:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: EBADF, read
我不希望在重新加载期间关闭端口,因为这会干扰登录到Pi


我使用的是节点v0.10.26,但v0.8.17运行时也会发生同样的情况,假设您打算只打开一个串行连接和一个网站连接,请尝试类似的操作

var fs = require('fs');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.writeHead(200, { 'Content-type': 'text/html'});
    res.end(fs.readFileSync(__dirname + '/engComp.html'));
});

var io = require('socket.io').listen(server);

var SerialPort = require('serialport').SerialPort;
var sp = new SerialPort('/dev/ttyAMA0', {
    baudrate: 9600,
    parser: serialport.parsers.readline('\r')
});

io.on('connection', function (socket) {
  console.log('socket open');

  socket.on('data', function(recData) {
    console.log('http rec data =', recData);
    sp.write(recData, function(err, results){
        console.log('serial port send data =', recData);
    });
  });
});

sp.open(function () {
  console.log('serial port open');

  server.listen(8080, function(){
    console.log('Listening at: http://localhost:8080');
  })

  sp.on('data', function(sdata) {
    io.emit('sdata', sdata);
    console.log('serial port rec sdata = ', sdata);
  });
});

现在只有一个串行端口连接打开,请求之间没有打开/关闭。此外,网站只在串行端口打开并准备好接收数据后才开始侦听连接。

我是node.js的新手,可能对范围和回调感到困惑。我需要将数据从串行设备发送到网页ge。在我看来,我的串行数据,
sdata
socket
在不同的函数中。即使它们在回调中定义,我是否可以将它们设置为全局的?是的,对不起,我忘了问这个问题:如果我只点击sp.open()一次?要将数据从sp发送到网页,可以使用io.emit。我已将该示例添加到上面的答案中。使用上面的代码,您会看到多条“串口打开”消息?不,我没有收到多条“串口打开”消息,只有多条“串口记录=”消息。我使用socket.emit将数据发送到网页。多条“串行端口记录”是正常的。当设备报告更多数据时,应多次调用它。我没有说清楚。我(用我的代码)得到了每个串行数据点的多个报告。如果第一次打开页面时串行数据为:1,2,3,我会在控制台上得到1,2,3。如果我重新加载页面(或从另一台设备访问页面)我得到了1,1,2,2,3,3。如果我重新加载页面10X,我得到了每个页面的10个,而没有任何额外的“串行端口打开”报告。但是你的代码工作得非常好,所以我会接受你的答案,同时我会绞尽脑汁想为什么我所做的是错误的。