从 NodeJs 串口读取数据
Reading data from NodeJs Serialport
我希望能够读取发送的 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
已经写好了
本质上是记录命令成功写入控制台的响应
有一些特殊之处。
您可以在应用程序启动时打开端口,并在关闭端口时重新连接或在每次请求时打开端口。它定义了如何处理数据流。如果您向端口发送请求,则答案可以包含先前请求(多个)的数据。您可以忽略此问题(如果答案很短且请求间隔足够大)或使用分配 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;
我希望能够读取发送的 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
已经写好了
本质上是记录命令成功写入控制台的响应
有一些特殊之处。
您可以在应用程序启动时打开端口,并在关闭端口时重新连接或在每次请求时打开端口。它定义了如何处理数据流。如果您向端口发送请求,则答案可以包含先前请求(多个)的数据。您可以忽略此问题(如果答案很短且请求间隔足够大)或使用分配 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;