2016-08-22 49 views
0

送信されたasciiコマンドで受信したデータを読み取ることができます。以下は NodeJsシリアルポートからデータを読み取る

はdocに私のロックコントローラ

var express = require('express'); 
var router = express.Router(); 
var SerialPort = require('serialport'); 


/* GET home page */ 
router.get('/', function(request, response){ 


    SerialPort.list(function (err, ports) { 
     ports.forEach(function(port) { 
     console.log(port.comName); 
     console.log(port.pnpId); 
     console.log(port.manufacturer); 
     }); 
    }); 


    var port = new SerialPort("COM5", { 
    baudRate: 38400 
}); 

    port.on('open', function() { 
     // NodeJS v4 and earlier 
     port.write(new Buffer('status1', 'ascii'), function(err) { 
      if (err) { 
      return console.log('Error on write: ', err.message); 
      } 
      console.log('message written'); 

     }); 
    }); 

    // open errors will be emitted as an error event 
    port.on('error', function(err) { 
     console.log('Error: ', err.message); 
    }); 

}); 

// Important 
module.exports = router; 

にコマンドを送信するコードである、それは、https://github.com/EmergingTechnologyAdvisors/node-serialport#serialportparsers--objectを試してみて、データを読み取るためにパーサの使用に言及したが、私はそれを実装するかどうかはわからない、と私はコマンドstatus1が書かれた後に実行したいと思う。

は、基本的にコマンドの応答が正常にいくつかの特殊性があります

答えて

1

コンソールに書き込まれ記録されます。
アプリケーションの開始時にポートを開き、各要求時にポートのクローズポートまたはオープンポートで再接続できます。それはデータフローの仕組みを定義します。リクエストをポートに送信すると、answerには以前のリクエストのデータ(複数)が含まれます。この問題を無視することができます(応答が短く、要求間隔が十分大きい場合)。または、このIDを持つassign idとsearch answerで要求を送信します。

SerialPort.list(function (err, ports) { 
    ports.forEach(function(port) { 
     console.log(port.comName, port.pnpId, port.manufacturer); // or console.log(port) 
    }); 
}); 

router.get('/', function(req, res){ 
    function sendData(code, msg) { 
     res.statusCode = 500; 
     res.write(msg); 
     console.log(msg); 
    } 

    var port = new SerialPort("COM5", { 
     baudRate: 38400 
    }); 

    port.on('open', function() { 
     port.write(Buffer.from('status1', 'ascii'), function(err) { 
      if (err) 
       return sendData(500, err.message); 

      console.log('message written'); 
     }); 
    }); 

    var buffer = ''; 
    port.on('data', function(chunk) { 
     buffer += chunk; 
     var answers = buffer.split(/\r?\n/); \\ Split data by new line character or smth-else 
     buffer = answers.pop(); \\ Store unfinished data 

     if (answer.length > 0) 
      sendData(200, answer[0]); 
    }); 

    port.on('error', function(err) { 
     sendData(500, err.message); 
    }); 
}); 

module.exports = router; 
+0

ありがとうございました。私は、行varの答え= buffer.split( '\ n')で次のエラーに遭遇した。 \\改行文字またはsmth-elseでデータを分割するSyntaxError:予期しないトークンILLEGAL – John

+1

'\ n 'を'/\ r?\ n/'(別の区切り文字を使用する)に変更する。 –

+0

ありがとうございます。どのように私はwheterを確認することができますか、私はコマンドの問題(これはコマンドが正常に受信され、理解されたかどうかを教えてくれます)への応答の面でコントローラからのメッセージを受け取っていませんか? – John

関連する問題