You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js读取USB串口数据?称重数据读取代码故障求助

问题排查与修复方案

你的代码存在几个核心问题,导致无法正常运行,下面逐一拆解并给出修复后的代码:

核心问题点

  • 串口路径错误:Windows下USB转串口几乎不会是COM1,去设备管理器的「端口(COM和LPT)」里找实际的串口编号,比如COM3、COM4。
  • 重复绑定事件导致逻辑混乱:每次请求/getweighdata都会给parser绑定新的data事件,多次请求后同一条串口数据会触发多次响应,还会造成内存泄漏。
  • 缺少错误监听:串口连接失败、数据读取出错时没有任何提示,根本不知道问题出在哪。
  • 请求无超时处理:如果串口长时间没数据,HTTP请求会一直挂着,客户端永远等不到响应。
  • 全局变量风险:app = express();没有用const声明,会变成全局变量,复杂场景下容易出问题。

修复后的代码

const http = require('http');
const express = require('express');
const hostname = '127.0.0.1';
const port = 3000;
const path = require('path');
const { SerialPort } = require('serialport')
const { ReadlineParser } = require('@serialport/parser-readline')

// 声明为局部变量,避免全局污染
const app = express();
const server = http.createServer(app);

// 存储最新的称重数据
let latestWeighData = null;

// 初始化串口,手动控制打开时机
const serialPort = new SerialPort({
    path: 'COM3', // 替换成你实际的串口编号
    baudRate: 9600,
    autoOpen: false
});

// 监听串口错误,方便排查问题
serialPort.on('error', (err) => {
    console.error('串口错误:', err.message);
});

// 串口打开成功后再绑定数据监听
serialPort.open((err) => {
    if (err) {
        return console.error('打开串口失败:', err.message);
    }
    console.log('串口连接成功');
    const parser = serialPort.pipe(new ReadlineParser({ delimiter: '\r\n' }));
    // 只绑定一次data事件,实时更新最新数据
    parser.on('data', (data) => {
        console.log('收到称重数据:', data);
        latestWeighData = data.trim(); // 去除首尾空白字符
    });
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

// HTTP接口返回最新称重数据
app.get('/getweighdata', (req, res) => {
    // 设置5秒超时,防止请求挂死
    const timeout = setTimeout(() => {
        res.status(504).json({ error: '获取称重数据超时' });
    }, 5000);

    // 如果已有缓存数据,直接返回
    if (latestWeighData) {
        clearTimeout(timeout);
        res.json({ weighData: latestWeighData });
        return;
    }

    // 临时监听一次新数据,返回后解绑事件
    const parser = serialPort.pipe(new ReadlineParser({ delimiter: '\r\n' }));
    const onNewData = (data) => {
        clearTimeout(timeout);
        res.json({ weighData: data.trim() });
        parser.off('data', onNewData);
    };
    parser.once('data', onNewData);
});

额外注意事项

  • 确认串口的波特率、数据位、停止位、奇偶校验和称重设备的设置完全一致,9600波特率不一定是设备默认值,务必查看设备手册。
  • Windows下运行代码可能需要管理员权限启动终端;Linux/macOS下需要给串口设备加读写权限,比如执行sudo chmod 666 /dev/ttyUSB0(替换为实际设备路径)。
  • 先用串口调试工具(比如SSCOM、PuTTY)测试设备是否能正常输出数据,排除硬件或设备本身的问题。

内容的提问来源于stack exchange,提问作者Bhekhraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:35:20