一次遥测波形上报后出现极端尖峰的故障排查记录

设备使用 STM32L4 系列 MCU,外接合宙 4G 模块上传传感器数据。业务中有一段几百 KB 的遥测数据,供后台前端预览时间序列波形。

故障现象是前端曲线偶发极端尖峰,峰值明显超出传感器量程,破坏整段波形可读性。可能来源有三个:传感器采集异常、MCU 输入缓冲区被改写、遥测上报链路数据损坏。

数据路径

传感器采集 -> 输入缓冲区 -> 边缘 AI 推理 -> 遥测报文打包 -> 合宙 4G 模块 -> 云后台 -> 前端波形预览

报文本身带 CRC32,后端收到后计算并记录校验结果。这段波形只用于问题分析和体验改进,所以即使校验失败,后端仍会保存报文并生成报告,损坏数据因此会继续进入前端预览。

排除采集与内存损坏

在固件里加两个校验点:边缘 AI 推理前和数据上报后,各对同一份输入缓冲区算一次 CRC32。同时加断言,检查采样值量程、缓冲区长度和写指针。

uint32_t crc_before = crc32_calc(input_buf, input_len);

for (size_t i = 0; i < sample_count; i++) {
    ASSERT(sample[i] >= SENSOR_MIN);
    ASSERT(sample[i] <= SENSOR_MAX);
}

run_edge_ai_inference(input_buf, input_len);
upload_telemetry_packet(input_buf, input_len);

uint32_t crc_after = crc32_calc(input_buf, input_len);
ASSERT(crc_before == crc_after);

实测两次 CRC32 一致,断言未触发。输入缓冲区在推理前后没有被改写,传感器输出也没有超量程值。范围收敛到报文打包、串口传输、4G 模块发送、云端接收和后端解析。

后端 CRC32 日志

检查出现尖峰的报告,对应的遥测上报都存在 CRC32 校验错误。三条证据放在一起:

错误字节被后端按原格式解析,解释成异常大的采样值,这就是前端尖峰的来源。波形渲染和边缘 AI 推理的嫌疑排除。

板级差异

老 PCB 复现,新 PCB 未复现同类 CRC32 错误。两个版本 STM32L4 到 4G 模块的主要连接没有改动,原理图差异在其他边缘线路。

新 PCB 稳定不能证明老 PCB 某个器件坏了,它给出的约束是:固件和后端协议基本可用,问题与旧硬件环境下的大块数据上报强相关。后续方向是硬件版本差异、供电完整性、4G 模块发射时的电源与地噪声。

结论

MCU 侧输入缓冲区前后 CRC32 一致、断言未报错,采集和内存安全的嫌疑排除;后端日志显示尖峰报告存在遥测 CRC32 错误,大块数据上报链路确实存在损坏;老 PCB 复现、新 PCB 不复现,把方向指向硬件版本差异与供电完整性。

遥测数据用于排查故障时,允许 CRC32 错误的数据进入报告可以接受,但后端必须记录校验结果、前端必须标记完整性状态。否则损坏点会被画成正常曲线,通信问题伪装成传感器异常。