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

NodeJS使用Serialport Readline如何拼接零散串口数据为完整字符串

问题原因

你当前的代码直接监听串口实例的data事件,该事件是串口底层收到任意字节就立即触发,所以会逐字符输出,同时你引入的Readline解析器配置错误、没有被正确使用,无法实现自动拼接帧的功能。

修改方案

提供两种实现方案,可根据你的设备实际输出规则选择:

方案1:使用官方Readline解析器(推荐)

如果你的RFID读卡器输出每段完整数据后会携带换行符作为分隔符,直接用该方案即可,不需要自己维护缓冲区:

var SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');

var sp = new SerialPort('/dev/tty.usbserial-0001', {
    baudRate: 4800,
    parity: 'none'
});
// 绑定解析器,配置帧分隔符为换行符
const parser = sp.pipe(new Readline({ delimiter: '\n' }));

sp.on('open', function () {
    console.log('open');
    // 监听解析器的data事件,仅收到完整一帧时才触发
    parser.on('data', function (data) {
        // 去除首尾空白字符后输出
        const fullData = data.trim();
        console.log(fullData);
    });
});

方案2:手动维护缓冲区

如果你的设备没有固定换行分隔符,可以根据你示例的完整数据长度(示例中完整字符串长度为10)手动拼接:

var SerialPort = require('serialport');

// 数据缓冲区,存储收到的零散字符
let receiveBuffer = '';
// 你的完整数据的固定长度,根据实际情况调整
const FULL_DATA_LENGTH = 10;

var sp = new SerialPort('/dev/tty.usbserial-0001', {
    baudRate: 4800,
    parity: 'none'
});

sp.on('open', function () {
    console.log('open');
    sp.on('data', function (data) {
        // 把当前收到的字符追加到缓冲区
        receiveBuffer += data.toString();
        // 缓冲区长度达标时截取输出,剩余内容留在缓冲区等待下一次拼接
        if (receiveBuffer.length >= FULL_DATA_LENGTH) {
            const fullData = receiveBuffer.slice(0, FULL_DATA_LENGTH);
            console.log(fullData);
            receiveBuffer = receiveBuffer.slice(FULL_DATA_LENGTH);
        }
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:39:03