Node.js开发串口应用时如何将读取到的data数据存入变量
Node.js串口数据存储到变量解决方案
核心原因
你遇到的undefined问题本质是Node.js的异步事件驱动机制:parser.on('data', callback)的回调函数只有在串口实际收到数据时才会触发执行,你在回调执行前访问全局变量、或者尝试用return获取回调返回值,都拿不到有效数据。
实现方案
方案1:回调内直接处理(最适配写入MySQL的场景)
直接把使用数据的逻辑放在data回调内执行,保证访问时数据已经被赋值,修改后的代码如下:
var SerialPort = require('serialport'); const parsers = SerialPort.parsers; const parser = new parsers.Readline({ delimiter: '\r\n' }); var port = new SerialPort('COM10',{ baudRate: 9600, dataBits: 8, parity: 'none', stopBits: 1, flowControl: false }); port.pipe(parser); // 存储变量定义:只存最新值用普通变量,存所有历史数据用数组 let latestSerialData = null; let allSerialData = []; parser.on('data', function(data) { console.log('Received data from port: ' + data); // 赋值存储 latestSerialData = data; allSerialData.push(data); // 直接在回调内调用写库逻辑,确保拿到的是有效数据 saveDataToMysql(latestSerialData) }); // 封装MySQL写入逻辑 function saveDataToMysql(data) { // 此处写你的MySQL插入逻辑,data即为正常获取到的串口数据 }
方案2:事件通知(适合多模块共用串口数据的场景)
如果需要在其他代码位置使用串口数据,可以用Node.js内置的EventEmitter做事件通知,避免同步访问undefined的问题:
const EventEmitter = require('events'); // 全局事件实例 const serialEvent = new EventEmitter(); parser.on('data', function(data) { latestSerialData = data; // 抛出数据就绪事件 serialEvent.emit('data-ready', data) }); // 其他需要使用串口数据的位置监听事件即可 serialEvent.on('data-ready', (data) => { // 此处处理对应的业务逻辑 })
注意事项
- 不要在data回调之外的同步代码中直接访问存储串口数据的变量,此时回调还未触发,变量必然是初始的null/undefined值
- 所有依赖串口数据的业务逻辑(比如写入MySQL、数据上报等)都应该在data回调触发后执行
内容的提问来源于stack exchange,提问作者machofvmaciek
相关产品推荐
相关产品推荐

