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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:36:09