使用node js读取串口数据
Read Serial port data using node js
我想从串口读取数据并在需要时从数据中获取
这是我的代码
const http = require('http');
const hostname = 'localhost';
const { SerialPort } = require('serialport')
const { ReadlineParser } = require('@serialport/parser-readline')
const { io } = require('socket.io');
let express = require('express')
const serialPort = new SerialPort({
path: 'COM4',
baudRate: 9600 ,
})
const parser = serialPort.pipe(new ReadlineParser({ delimiter: '\r\n' }))
let app = express();
var port = 8080;
const server = http.createServer(app);
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
app.get('/get_data', function(req, res) {
parser.on('data', function(data) {
res.json({'weight': data});
});
});
当我尝试获取数据时,我得到了 ERR_HTTP_HEADERS_SENT: 发送给客户端后无法设置 headers
当 localhost:8080/get_data 请求时,我需要串口数据 谁能帮忙?
来自 parser
的数据事件可能不止一次触发,这意味着您将不止一次调用 res.json
。正如您在 express api documentation 中看到的那样,res.json
设置了 content-type
header...因此每个请求只能调用一次。因此错误。
我觉得遇到这种情况一般会做的就是设置排队系统。一个简单的版本可能会使用数组来完成,但如果您在生产服务器中使用它,则最好使用适当的消息队列系统(例如 rabbitMQ、kafka、AWS SQS 等)。
下面是一个如何使用数组的示例:
const queue = [];
parser.on('data', function(data) {
// push new data onto end of queue (array)
queue.push(data);
});
app.get('/get_data', function(req, res) {
if (req.params.getFullQueue === 1) {
// empty complete contents of current queue,
// sent to client as an array of { weight: x } objects
const data = queue.splice(0, queue.length)
.map(x => ({ weight: x }));
res.json(data);
} else {
// get oldest enqueued item, send it only
res.json({ weight: queue.shift() });
}
});
app.get
中的 if/else
是为了说明这两个选项,具体取决于您要使用的选项。在生产环境中,您可能想要实现分页,或者甚至是 websocket 或 EventSource,以便可以在数据可用时将其推送。
我想从串口读取数据并在需要时从数据中获取
这是我的代码
const http = require('http');
const hostname = 'localhost';
const { SerialPort } = require('serialport')
const { ReadlineParser } = require('@serialport/parser-readline')
const { io } = require('socket.io');
let express = require('express')
const serialPort = new SerialPort({
path: 'COM4',
baudRate: 9600 ,
})
const parser = serialPort.pipe(new ReadlineParser({ delimiter: '\r\n' }))
let app = express();
var port = 8080;
const server = http.createServer(app);
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
app.get('/get_data', function(req, res) {
parser.on('data', function(data) {
res.json({'weight': data});
});
});
当我尝试获取数据时,我得到了 ERR_HTTP_HEADERS_SENT: 发送给客户端后无法设置 headers 当 localhost:8080/get_data 请求时,我需要串口数据 谁能帮忙?
来自 parser
的数据事件可能不止一次触发,这意味着您将不止一次调用 res.json
。正如您在 express api documentation 中看到的那样,res.json
设置了 content-type
header...因此每个请求只能调用一次。因此错误。
我觉得遇到这种情况一般会做的就是设置排队系统。一个简单的版本可能会使用数组来完成,但如果您在生产服务器中使用它,则最好使用适当的消息队列系统(例如 rabbitMQ、kafka、AWS SQS 等)。
下面是一个如何使用数组的示例:
const queue = [];
parser.on('data', function(data) {
// push new data onto end of queue (array)
queue.push(data);
});
app.get('/get_data', function(req, res) {
if (req.params.getFullQueue === 1) {
// empty complete contents of current queue,
// sent to client as an array of { weight: x } objects
const data = queue.splice(0, queue.length)
.map(x => ({ weight: x }));
res.json(data);
} else {
// get oldest enqueued item, send it only
res.json({ weight: queue.shift() });
}
});
app.get
中的 if/else
是为了说明这两个选项,具体取决于您要使用的选项。在生产环境中,您可能想要实现分页,或者甚至是 websocket 或 EventSource,以便可以在数据可用时将其推送。