2014-09-08 1 views
0

Я пытаюсь использовать node.js на малине Pi для интерфейса последовательного устройства. Я хочу отправить данные с устройства на веб-страницу, отправить данные управления с веб-страницы на устройство и записать и сохранить данные на Pi. Когда я запускаю это:Несколько Serialport читает после перезагрузки веб-страницы в node.js

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() он сбой:

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

Я предпочел бы, чтобы не закрывать порт durring перезагрузки, так как это будет мешать Loging к Pi.

Я использую v0.10.26 узла, но то же самое происходит с v0.8.17

ответ

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

В настоящее время открыто только одно подключение к последовательному порту, и оно не открывается и не закрывается между запросами. Кроме того, веб-сайт только начинает прослушивать соединения после того, как последовательный порт был открыт и готов для данных.

+0

Я новичок в node.js и может быть смущен о сфере и обратных вызовах. Мне нужно отправить данные с последовательного устройства на веб-страницу. Мне кажется, что мои серийные данные, 'sdata' и' socket' находятся в разных функциях. Могу ли я сделать их глобальными, даже если они определены в обратном вызове? И да, извините, я забыл задать вопрос: почему я получаю несколько открытых последовательных соединений, если только ударил sp.open() один раз? –

+0

Чтобы отправить данные с sp на веб-страницу, вы можете использовать io.emit. Я добавил этот пример к приведенному выше ответу. С помощью приведенного выше кода вы видите несколько сообщений «serial port open»? –

+0

Нет, я не получал несколько сообщений «serial port open» только с несколькими сообщениями «serial port rec sdata =». Я использовал socket.emit для отправки данных на веб-страницу. –