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

时间:2014-09-08 19:05:24

标签: 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'});
    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个输出。

如果我放回(un-rem)sp.close(),它会一直工作,直到我按预期重新加载(端口关闭但从未重新打开)。

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

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: EBADF, read

我不想在重新加载时关闭端口,因为这会干扰登录到Pi。

我使用的是节点v0.10.26,但v0.8.17

也是如此

1 个答案:

答案 0 :(得分:0)

假设您打算只打开一个串行连接并打开一个网站连接,请尝试这样的操作。

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

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