使用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配置中唯一指定的串口参数 - 我收到了固件作者给出的实现建议:
你需要实现三个部分:
- 用于存储有效载荷的消息缓冲区
- 作为串口数据缓存的队列
- 适配自身应用场景的传输协议
消息缓冲区与队列的实现可参考源码中的
spislave.cpp文件,将其中的SPI发送调用替换为串口发送调用即可;传输协议设计需要考虑传输开销与校验机制,例如可以采用字节数组格式传输,或采用类似NMEA协议的带校验位逗号分隔UTF-8字符串格式传输。
我目前对该实现思路的具体落地方法尚不熟悉,正在学习相关内容。另外,该固件对接The Things Network平台时用于解析设备载荷的可用JavaScript解码代码可参考源码中的packed_decoder.js文件。
内容的提问来源于stack exchange,提问作者mheavers
相关产品推荐
相关产品推荐

