我正在尝试在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(连接)回调中,并且在页面重新加载时(在sp.close()之后但在sp.open()之前串行数据进入,它会崩溃:< / p>
events.js:72
throw er; // Unhandled 'error' event
^
Error: EBADF, read
我不想在重新加载时关闭端口,因为这会干扰登录到Pi。
我使用的是节点v0.10.26,但v0.8.17
也是如此答案 0 :(得分: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);
});
});
现在只打开了一个串行端口连接,它不会在请求之间打开/关闭。此外,网站仅在打开串口并准备好数据后才开始侦听连接。