结论:BMW E46 的 PT-CAN 是一张没有加密、没有网关隔离的广播总线:500 kbps、11 位 ID、DLC=8,DME、DSC、IKE、转向角传感器和(选装)变速箱都在这张网上直接广播,被动监听即可解码转速、水温、车速、四轮速、转向角、制动压力、挡位、里程与油量等信号。它的典型难点不在「能不能抓」,而在同一份 ID 在 MS42(M52TU)与 MS43(M54)上字节位置不同:源文档明确标注 MS42 的字节位置是从 MS43 文档抄来的、仍需真实抓包验证。下述结论仅限源文档记录的这一套 DME+DSC+IKE 组合。
车辆与适用范围
源文档是一份开源车载仪表项目为 E46 机箱写的 CAN 参考,信号表的权威来源是公开的 MS4X 维基,项目自述其解码表「逐字节镜像维基表格」。项目本身处于早期(README 自述 Early),只覆盖 E46 的 PT-CAN 一张网。
| 项 | 内容 |
|---|---|
| 车型 | BMW E46,覆盖 M52TU(MS42)与 M54(MS43)两种 DME |
| 年款 / 市场版本 | 源文档未给出具体年款与市场版本,只按 DME 区分 M52TU / M54 |
| ECU / 改装状态 | DME(MS42/MS43)、MK60 / DSC III ABS、IKE 仪表、转向角传感器、可选 EGS 自动变速箱;使用 SLCAN 适配器被动监听,不改线束 |
| 采集跨度 | 源文档未给出日志数或帧数;DBC 侧记载 MS42 文件 11 条报文、102 条信号,MS43 文件 11 条报文、108 条信号 |
| 适用范围 | 仅限文档所记录的 MS42/MS43 + DSC + IKE 组合;具体年款、动力总成、ABS 版本与配置须自行核对 |
总线与寻址
源文档明示 PT-CAN 运行在 500 kbps、11 位 ID、DLC=8。多字节整数都注明端序;位位置写成 B<字节>.<位>,位 0 是 LSB;百分比缩放的规范系数是 BMW 的 0.390625 = 100/256。有一点很关键:项目只做广播帧的监听与解码,明确不做诊断协议(无 DS2、无 UDS、无 EDIABAS)。
| 项 | 内容 |
|---|---|
| 物理层 | 双绞线 CAN,PT-CAN(动力总成 CAN) |
| 链路层 / 比特率 | 500 kbps(源文档明示) |
| 寻址方式 | 11 位 ID,DLC=8 |
| CAN FD | 否;源文档按经典 CAN(8 字节载荷)处理 |
| 端序约定 | 绝大多数报文为 Intel/小端;LWS1(0x1F5,转向角)为 Motorola/大端 |
| 不做的事 | 不含诊断协议;电池电压不在 PT-CAN 广播,只能走 DS2 诊断 |
已解码信号
下表从源文档的信号表中抽取代表性条目。MS43 独有或与 MS42 位置不同的信号单独标注;源文档标注「未验证」「无外部旁证」的条目按原样保留。
| 信号 | 位置(ID / 字节 / 位) | 解码 | 证据 |
|---|---|---|---|
| 转速 N_ENG | 0x316 DME1,B2-B3 小端 | × 0.15625 rpm | MS4X 维基 0x316 页 |
| 指示扭矩 TQI_CAN | 0x316,B4 | × 0.390625 % | MS4X 维基 0x316 页 |
| 冷却液温度 TEMP_ENG | 0x329 DME2,B1 | × 0.75 − 48 → °C | MS4X 维基 0x329 页 |
| 油门踏板 TPS_CAN | 0x329,B5 | × 0.390625 % | MS4X 维基 0x329 页 |
| 车速 VSS | 0x153 ASC1,13 位(B1.3-7 + B2) | ((MSB×256+LSB − 0x160) × 0.0625) km/h | 维基公式;源文档指出维基公式与「最小值 0x160」不自洽,解码器补了偏移并钳位到 ≥0 |
| 四轮车速 | 0x1F0 ASC2,B0-B7 小端(每 2 字节一轮) | (raw − 44) / 15.875 km/h | MS4X 维基 0x1F0 页;raw 最小 0x002C=44 对应 0 |
| 转向盘转角 ANG_PSTE | 0x1F5 LWS1,B0-B1 大端 | 有符号 × 0.04394° | 维基页;源文档指出维基把量表四舍五入,真实系数约 0.04395,解码器仍用维基系数 |
| 转角角速度 VEL_ANG_PSTE | 0x1F5,B2-B3 大端 | 有符号 × 0.04394 °/s | MS4X 维基 0x1F5 页 |
| 制动压力 P_BRAKE | 0x1F8 ASC4,B2 | × 1 bar(0–255) | MS4X 维基 0x1F8 页 |
| 纵/横向加速度 AX_REF / AY_REF | 0x1F3 ASC3,10 位有符号原始值 | 维基未给缩放;界面按 10 位有符号原始值呈现 | MS4X 维基 0x1F3 页(无缩放公式) |
| 挡位 GEAR_INFO | 0x43F EGS1,B0.0-2 | 3 位枚举(0=N,1-6 前进挡,7=R) | MS4X 维基 0x43F 页 |
| 里程 KM_CTR_CAN | 0x613 ICL2,B0-B1 小端 | × 10 → km | MS4X 维基 0x613 页 |
| 油量 FTL_CAN | 0x613,B2.0-6 | 7 位原始值(仪表映射到刻度) | MS4X 维基 0x613 页 |
| 机油温度 TOIL_CAN | 0x545 DME4,B4(MS43 独有) | raw − 48 → °C | MS4X 维基 0x545 页;MS42 不广播此字节 |
| 油面高度(MSS54HP) | 0x545,B6(MS43 独有) | (raw − 158) / 10 → L | MS4X 维基 0x545 页 |
读取方法与注意事项
第一是端序陷阱:源文档特别提醒 Intel/小端的 start bit 是 LSB,而 Motorola/大端的 start bit 是 MSB,两者在同一个字节里所指的位完全不同。E46 上除 LWS1 转向角外都是 Intel,LWS1 是唯一的 Motorola 报文,混用会解出错误数值。
第二是 MS42 / MS43 的字节错位:源文档用一整节列出 DME 发送帧里两种 DME 把信号放在不同位置的条目。例如 TQI_MAF_CAN 在 MS43 位于 DME1 的 B7、在 MS42 位于 B6;机油温度、换挡提示、机油压力低、胎压、机油液位等一串信号在 MS42 上根本不广播。源文档据此为 MS42 做了一个去掉 MS43 专有信号、并重定义 TQI_MAF_CAN 与 ERR_AMT_CAN 字节位置的配置。
第三是维基公式的已知瑕疵。车速那条,维基同时给出「公式 = ((MSB×256)+LSB) × 0.0625」和「最小值 0x160(0 km/h)」,两者只有在先减偏移再缩放时才自洽;解码器选择减去 0x160 并钳位到 ≥0,让静止车读 0。转向角那条,维基把量表取整到 5 位有效数字(0.04394),真实系数约为 0.04395,量程末端会有约 0.2° 偏差。
第四是取值语义:源文档规定解码器只在「该帧本就不携带该信号」时(多路复用场景)返回空值,绝不把「数值未知」编码成空值——那是仪表该处理的事,不是解码器的职责。
证据等级与边界
可视为外部旁证的是各条 ID 对应的维基页面,项目自述解码表与维基表格逐字节一致;这属于公开文档级证据,不等同于本项目自己的实车复现。属于明确不确定性的是 MS42:维基 MS42 页自己写了「数值抄自 MS43 页,需验证」,因此 MS42 专有的字节位置在真实抓包确认前应视为暂定。
不能外推的地方有两处。第一,可选装件会改变报文存在性:EGS 自动变速箱、SMG 变速箱、MSS54 相关信号只在对应配置上出现,源文档明确把 0x338 DME3、0x43D AMT1、0x445 TXU1、0x610 ICL1 列为「未解码」,理由分别是赛道化选装、缺真实 SMG 抓包、维基页为空、以及对 VIN 远程帧只做被动监听。
第二,本文所有条目都绑定 E46 PT-CAN 这一张网与文档所列 ECU 组合,不能套到其他宝马机箱或其他总线(例如诊断总线)。电池电压这条尤其要记住:源文档写明它不在 PT-CAN 由任何已记录的 DME 广播,只能通过 DS2 诊断获得,所以「在广播流里找电池电压」在这台车上找不到。
常见问题
E46 的 OBD 口能直接抓到这些信号吗?
源文档记录的是 PT-CAN 广播帧的监听与解码,总线为 500 kbps、11 位 ID。它明确不做诊断协议(无 DS2、无 UDS、无 EDIABAS),也不保证从标准诊断适配器(如只透传 ISO-TP 请求/响应的电缆)能拿到广播帧;实际取数用 SLCAN 适配器被动监听。
为什么同一条 ID 在 MS42 和 MS43 上解码结果不同?
因为源文档列出了一串信号在两种 DME 上位于不同字节:例如 TQI_MAF_CAN 在 MS43 是 DME1 的 B7、在 MS42 是 B6,机油温度等信号 MS42 直接不广播。项目为此为 MS42 单独定义了一套配置。
车速解码为什么要先减 0x160?
因为源文档指出维基的公式与「最小值 0x160 对应 0 km/h」不自洽,只有在缩放前减去该偏移才能让静止车读 0;解码器据此补了偏移并钳位到 ≥0。
电池电压能从总线上读到吗?
不能。源文档写明电池电压不在 PT-CAN 由已记录的 DME 广播,只能通过 DS2 诊断获得。
延伸阅读
- CAN 报文解析的「健康位」在说什么:校验、计数器与总线空窗 —— 与本文计数器(Alive counter)与取值语义相关。
- 车载信号为什么会说谎:TTL、源时间与 500 ms 新鲜度阈值 —— 承接广播帧解码后的新鲜度判读。
- UDS 诊断工具为什么不能随手调:只读、会话与写 ECU 的分权设计 —— 说明本文「只监听、不做诊断」的取舍。
- Volvo P1 双 CAN 档案:HS 500 kbit/s 与 LS 125 kbit/s —— 另一套同样是 11 位广播解码的欧系车档案。
- Fiat Ducato X250 车身 CAN 档案:50 kbit/s 上的 24 条信号 —— 对照「低速车身网 + 发动机走 K 线」的架构。
参考资料
- 项目 01 ——
public-can-dbc-datasets/additional/emdzej-dashx-e46/docs/bmw-e46-can-ids.md(主来源:E46 PT-CAN ID 与逐字节信号表)。 - 项目 01 ——
public-can-dbc-datasets/additional/emdzej-dashx-e46/docs/vehicle-overlays.md(DBC + overlay 表达方式与端序/复用说明)。 - 项目 01 ——
public-can-dbc-datasets/additional/emdzej-dashx-e46/SOURCE.md(快照范围、DBC 信号条数与适用范围提示)。
说明:本文整理自第三方开源项目的公开文档,仅代表该文档所记录的单个车辆样本,不代表同型号全系车型。CAN 与诊断操作存在风险,任何实车操作前请自行复核并遵守当地法规。
更新记录
首次发布 2026-10-11 最近核对:2026-10-11
发表回复