0

Raspberry Pi で node.js を使用してシリアル デバイスに接続しようとしています。デバイスから Web ページにデータを送信し、Web ページからデバイスに制御データを送信し、データを 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() を元に戻す (un-rem) と、期待どおりにリロードするまで機能します (ポートは閉じられますが、再度開かれることはありません)。

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

開いているシリアル接続が 1 つだけで、Web サイト接続が 1 つだけ開いていることを前提として操作するには、次のようなことを試してください。

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

現在、開かれているシリアル ポート接続は 1 つだけで、要求間で開いたり閉じたりしません。さらに、Web サイトは、シリアル ポートが開かれてデータの準備が整った後にのみ、接続のリッスンを開始します。

于 2014-09-08T19:55:55.403 に答える