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

