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

使用serialports.js(Node.js)与ESP32串口通信时数据乱码如何解决

ESP32-Paxcounter串口数据读取乱码问题

我有一块烧录了ESP32-Paxcounter固件的ESP32开发板,该固件可通过LoRaWAN输出检测到的Wi-Fi、蓝牙设备数量统计值。在固件源码的senddata.cpp文件中可以看到输出统计值的日志语句:

ESP_LOGD(TAG, "Sending count results: pax=%d / wifi=%d / ble=%d", count.pax, count.wifi_count, count.ble_count);

但我暂未明确该日志通过串口输出的具体逻辑。

我基于Node.js的SerialPort.io库搭建了串口读取程序,已成功识别PC端接收数据的COM端口,编写的数据读取代码如下:

const SerialPort = require("serialport").SerialPort;

const serialPort = new SerialPort({
  path: "COM4",
  baudRate: 9600,
  autoOpen: false,
});

serialPort.open(function (error) {
  if (error) {
    console.log("failed to open: " + error);
  } else {
    console.log("serial port opened");

    serialPort.on("data", function (data) {
      // 获取缓存数据并解析为utf-8字符串
      console.log(data);
      data = data.toString("utf-8");
      console.log(data);
    });

    serialPort.on("error", function (data) {
      console.log("Error: " + data);
    });
  }
});

程序运行后可在Node.js中接收到Buffer格式的串口数据(例如<Buffer bc 08 AD>),但调用toString("utf-8")转换后输出为乱码。显然当前串口输出的编解码配置不匹配,但我不确定需要从哪些环节调整,想了解如何正确处理串口输出数据,使其转换为Node.js可正常使用的格式。


问题相关补充说明

  • 我使用的开发板为TTGO/LilyGO LoRa32,所用固件说明显示其支持该板型及SPI通信
  • 我在Windows/Mac系统下通过VSCode的platform.io扩展打开调试控制台时,可以获取到可读的串口数据,我确认波特率9600配置正确,这也是我在serialport配置中唯一指定的串口参数
  • 我收到了固件作者给出的实现建议:

你需要实现三个部分:

  1. 用于存储有效载荷的消息缓冲区
  2. 作为串口数据缓存的队列
  3. 适配自身应用场景的传输协议

消息缓冲区与队列的实现可参考源码中的spislave.cpp文件,将其中的SPI发送调用替换为串口发送调用即可;传输协议设计需要考虑传输开销与校验机制,例如可以采用字节数组格式传输,或采用类似NMEA协议的带校验位逗号分隔UTF-8字符串格式传输。

我目前对该实现思路的具体落地方法尚不熟悉,正在学习相关内容。另外,该固件对接The Things Network平台时用于解析设备载荷的可用JavaScript解码代码可参考源码中的packed_decoder.js文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:42:17