使用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,以便可以在数据可用时将其推送。