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 でも同じことが起こります