五菱 Air EV 的 CAN 信号:115 个 ID 与一处未解的字节冲突

作者:

在

结论:五菱 Air EV 的这份 CAN 嗅探研究给出了一条可复现的低成本采集链路和 115 个唯一 ID 的规模,但三个主参数的字节映射存在未解决的冲突:README 把油门踏板记在 0x17D 的字节 4 与 6,而随车保留的处理脚本把 0x155 标为踏板,并额外加了一个 0x1E5 电池电压。仓库里既没有 DBC、也没有原始 CSV 抓包和字节级换算公式,因此这些 ID 只能当作候选,不能当作已验证的解码表。

一条 500 kbit/s 的被动采集链路是怎么搭起来的

整套采集是被动的:ESP32 DevKitC 加 MCP2515 收发模块,走 OBD-II 接口的 6 脚(CAN High)与 14 脚(CAN Low),固件以监听模式运行,不做任何主动请求。晶振配置为 8 MHz,CAN 速率设为 500 kbit/s。一次约 49 分钟的道路测试记录下 115 个唯一 CAN ID。

抓下来的原始记录以分号分隔的 CSV 落地,Python 侧用 pandas 读取后,把 Data_Raw 这一列按空格拆成 Byte_1 到 Byte_8 八列,再按 CAN ID 做映射标注,最后导出成一份包含全部 115 个 ID 的 Excel。未被映射表命中的 ID 统一标记为「尚未识别」。

环节 配置项 取值 说明
控制器 MCU / 收发器 ESP32 DevKitC + MCP2515(8 MHz) 固件使用 mcp_can 库,监听模式
物理接入 OBD-II 引脚 6 脚 CAN High,14 脚 CAN Low 直接挂诊断口,无需破线
总线速率 标称波特率 500 kbit/s 由固件按 8 MHz 晶振配置
采样规模 时长与 ID 数 约 49 分钟,115 个唯一 ID 覆盖多种行驶工况
落盘格式 CSV 分隔符 分号 读取时需显式指定分隔符
后处理 字节拆分 Data_Raw 拆为 Byte_1–Byte_8 缺失字节填占位符
产出 汇总文件 REKAP_TOTAL_PERCOBAAN_DUA.xlsx 115 个 ID 全部进入汇总表

三处冲突:油门到底在哪个 ID

把 README 的结论和保留下来的处理脚本并排看,会发现两套标注并不一致。差异集中在踏板这一项上,另外脚本多出一个电池电压条目,而 README 完全没有字节级换算公式。

参数 README 给出的 ID 与字节 处理脚本给出的 ID 一致性判断
加速踏板位置 0x17D,字节 4 与字节 6 0x155 冲突,未解决
电机转速 0x16E,字节 5 与字节 7 0x16E ID 一致,无换算公式
电池电流 0x16C,字节 5 与字节 6 0x16C ID 一致,无换算公式
电池电压 未提及 0x1E5 脚本独有,无字节定义

需要强调的是:脚本里的映射只是一张 ID 到标签的字典,用于给每一行打标注,并不包含缩放因子、偏移量或字节序。也就是说,即便 ID 确定,也无法据此直接得到工程量。README 里那句「字节 4 与 6」是目前唯一出现的字节位置线索,且同样没有给换算规则。

为什么这个冲突不能靠猜来解决

两个 ID 指向同一类信号,在实际解码里是两种完全不同的后果:如果 0x155 才是踏板而 0x17D 是别的量,那么按 README 取数会得到一条看似有变化、实则无关的物理量曲线,而且因为它随工况变化,很容易被误判为「已经解出来了」。判定办法只有一条——同时抓两个 ID 的原始数据,踩踏板做阶跃,看哪个字节随踏板线性跟随。

证据边界:仓库里缺什么

这份材料的定位是学术研究记录,不是可用的解码资产。判断它能用到什么程度,关键看缺失项,而不是看已给出项。

缺失项 对使用的影响 建议处理
DBC 文件 无法用标准工具直接解码全部 115 个 ID 自建候选 DBC 时把每个 ID 标为待验证
原始 CSV 抓包 无法复算、无法复核字节位置 自行重采,保留原始文件
字节级换算公式 ID 确定也得不到工程量 用独立参考源做标定后再写公式
具体配置年款 无法判断结果能否迁移到同车型其他批次 记录自己的车辆配置,不跨车套用
独立标定记录 三个主参数的精度无从评估 用仪表读数或 OBD 标准 PID 交叉验证
明确的再分发许可 README 只要求署名,未给出许可证 仅作私有离线研究副本,商用前先确认权利

仓库里的两份 DOCX 论文和若干绘图图像并未随本次归档保留,因此论文中是否给出了更完整的推导,无从判断。这也是为什么「未解决」比「错误」更准确:现有材料不足以判定谁对。

常见问题

这份研究能给五菱 Air EV 出一份可用的 DBC 吗?

不能。仓库里没有 DBC,也没有原始 CSV 抓包与字节级换算公式,只有 115 个 ID 的规模和三个(实为四个)候选标签。它能提供的是采集方法和候选 ID 清单,DBC 必须由使用者自行采集、标定后重建。

油门踏板到底应该用 0x17D 还是 0x155?

目前无法确定。README 把踏板记在 0x17D 的字节 4 与 6,保留下来的处理脚本却把 0x155 标为踏板,两者冲突且未解决。可靠的判定方式是同时抓这两个 ID,踩踏板做阶跃,看哪个字节随踏板线性跟随。

500 kbit/s 是这个车型 OBD 口的确定波特率吗?

它是这次采集所用的配置值,不是车型的官方标称值。固件按 8 MHz 晶振把 CAN 速率设为 500 kbit/s 并成功收到 115 个 ID,说明该配置在本车可用;其他批次或年款是否一致未做验证。

为什么脚本映射出四个 ID 却没有任何换算公式?

因为脚本里的映射只是一张 ID 到标签的字典,作用是在汇总表里给每行打标注并统计 ID 分布,本身不做物理量解码。字节位置线索只在 README 中出现过一次,同样没有给出缩放因子与偏移量。

这份材料可以再分发或放进产品吗?

不建议直接使用。检查的仓库快照中没有找到任何许可证文件或 SPDX 声明,README 只提出署名要求,而署名要求并不构成明确的再分发许可。目前应按私有离线研究副本处理,商用前须确认权利。

延伸阅读

参考资料

  • 项目 01 —— public-can-dbc-datasets/additional/ilham511-wuling-air-ev/README.md(500 kbit/s 被动采集、115 个 ID、三个主参数的候选 ID 与字节)
  • 项目 01 —— public-can-dbc-datasets/additional/ilham511-wuling-air-ev/Processing_Data.py(ID 到标签的映射字典、字节拆分逻辑与汇总导出流程)
  • 项目 01 —— public-can-dbc-datasets/additional/ilham511-wuling-air-ev/SOURCE.md(快照版本、许可证状态与证据边界说明)

免责声明

本文所述 CAN ID、字节位置与采集参数均来自公开仓库的说明文件与脚本,未经独立实车验证,且 README 与脚本之间存在未解决的标注冲突。车辆配置年款、市场与 ECU 版本可能导致差异。涉及安全相关用途时请仅作参考,并以实际测量与官方资料为准。

更新记录

  • 2026-10-14 初稿

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注