Я пытаюсь использовать 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
Я новичок в node.js и может быть смущен о сфере и обратных вызовах. Мне нужно отправить данные с последовательного устройства на веб-страницу. Мне кажется, что мои серийные данные, 'sdata' и' socket' находятся в разных функциях. Могу ли я сделать их глобальными, даже если они определены в обратном вызове? И да, извините, я забыл задать вопрос: почему я получаю несколько открытых последовательных соединений, если только ударил sp.open() один раз? –
Чтобы отправить данные с sp на веб-страницу, вы можете использовать io.emit. Я добавил этот пример к приведенному выше ответу. С помощью приведенного выше кода вы видите несколько сообщений «serial port open»? –
Нет, я не получал несколько сообщений «serial port open» только с несколькими сообщениями «serial port rec sdata =». Я использовал socket.emit для отправки данных на веб-страницу. –