【问题标题】:Reading data from NodeJs Serialport从 NodeJs Serialport 读取数据
【发布时间】:2016-08-22 22:27:03
【问题描述】:

我希望能够读取发送的 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 后执行。

基本上记录成功写入控制台的命令响应

【问题讨论】:

    标签: javascript node.js npm serial-port


    【解决方案1】:

    有一些特殊性。
    您可以在应用程序启动时打开端口并在端口关闭或在每个请求上打开端口时重新连接。它定义了如何处理数据流。如果您向端口发送请求,则答案可以包含先前请求的数据(多个)。您可以忽略此问题(如果答案很短且请求间隔足够大)或使用分配 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;
    

    【讨论】:

    • 谢谢。我在 var answers = buffer.split('\n'); 行遇到以下错误\\ 按换行符或 smth-else 拆分数据 SyntaxError: Unexpected token ILLEGAL
    • '\n'改成/\r?\n/(我用了另一个分隔符)。
    • 谢谢。我如何能够验证我是否收到了来自控制器的关于对命令问题的响应的消息(这也将说明命令是否被成功接收和理解)?
    • 控制器可以在每个正确的请求上发送ACK-reply,但我认为你的情况太多了。
    • 每次com端口上的设备收到消息,如果请求正确,设备会立即发送ACK-reply(短消息)。前段时间发送result-reply(可以是某个块发送的长文本)。在节点端,如果您收到ACK,则等待result。如果没有收到ACK,那么端口有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2011-08-27
    • 2021-08-13
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多