0

我正在尝试在 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(connection) 回调中,并且在页面重新加载时串行数据进入(在 sp.close() 之后但在 sp.open() 之前它会崩溃:

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

我不希望在重新加载期间关闭端口,因为这会干扰登录到 Pi。

我正在使用节点 v0.10.26 但同样的事情发生在 v0.8.17

4

1 回答 1

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

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

于 2014-09-08T19:55:55.403 回答