我希望能够读取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
之后执行写入。
基本上记录成功写入控制台的命令的响应
答案 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;