从NodeJs Serialport

时间:2016-08-22 13:17:36

标签: javascript node.js npm serial-port

我希望能够读取ascii命令发送的数据。

以下是向我的锁控制器发送命令的代码

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 个答案:

答案 0 :(得分:1)

有一些特点 您可以在应用程序启动时打开端口,并在每个请求上重新连接端口关闭或打开端口。它定义了如何使用数据流。如果您向端口发送请求,则answer可以包含先前请求的数据(多个)。您可以忽略此问题(如果答案很短且请求间隔足够大)或发送带有assign id的请求并使用此id搜索答案。

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;