2016-08-22 506 views
0

我希望能够读取由发送的ascii命令接收到的数据。从NodeJs读取数据Serialport

下面是发送命令到我的锁控制器

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

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

谢谢。我遇到了以下错误在线var answers = buffer.split('\ n'); \\用新行字符或smth-else分割数据SyntaxError:意外的标记ILLEGAL – John

+1

将''\ n''改为'/ \ r?\ n /'(我使用另一个分隔符)。 –

+0

谢谢。我将如何验证我是否从控制器接收到了对命令问题的响应的消息(这也会告诉我们命令是否已经成功接收和理解)? – John