如何用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
相关产品推荐
相关产品推荐

