我正在尝试在 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