马自达 RX-8 的 CAN 笔记:6 个 ID、9 个信号与两处未定系数

作者:

在

结论:这是一份为赛道遥测整理的马自达 RX-8 CAN 笔记,用 6 个报文 ID 承载 9 个信号:0x201 同时给出油门、转速与车速,0x212 给出刹车与手刹两个开关量,0x231、0x420、0x250、0x81 各给出一个信号。它的价值在于把字节偏移、长度、位掩码与换算公式写到了可直接落地的粒度;边界也同样清楚——只在 2006 年款(series 1)手动挡带 DSC 的一台车上用 OBDLink MX+ 与 RaceChrono v7.5.3 验证过,转速除数还有 4.0 与 3.85 两套并存,刹车压力至今只有开关量、没有连续量。

九个信号的字段边界

先要澄清一个术语:笔记里的「PID」指的是 CAN 报文 ID,不是 OBD-II 服务 01 下的参数标识符。这决定了取数方式是被动监听总线,而不是主动请求应答。多字节值统一按大端解析,这是后面所有公式的前提。

信号 报文 ID 字节偏移 长度 位掩码 类型 换算公式
油门开度 0x201 6 1 无 UINT8 百分比 = 值 / 2(原始值范围 0 到 200)
引擎转速 0x201 0 2 无 UINT16 rpm = 值 / 4.0
车速 0x201 4 2 无 UINT16 km/h =(值 – 10000)/ 100.0
刹车踏板 0x212 5 1 0x08 Bool 踩下 = 值
手刹 0x212 4 1 0x40 Bool 拉起 = 值
空挡 0x231 0 1 0x80 Bool 空挡 = 取反后的值
冷却液温度 0x420 0 1 无 UINT8 摄氏度 = 值 – 40
进气温度 0x250 3 1 无 UINT8 摄氏度 = 值 – 40
转向角 0x81 2 2 无 INT16 度 = 值(有符号)

九个信号里 0x201 一条报文就占了三个,且彼此不重叠:转速在偏移 0 占 2 字节,车速在偏移 4 占 2 字节,油门在偏移 6 占 1 字节。这种紧凑布局意味着解析时一次取 8 字节即可解出三个量,但也意味着任何一个偏移写错都会静默地取到相邻信号。

位掩码到 RaceChrono 位号的换算

笔记给字节偏移与位掩码,RaceChrono 公式里用的却是 0 到 63 的位号,两者需要对账。RaceChrono 的约定是从最高位起算:位 0 是最高位,位 57 的权值为 64。据此可以推出换算关系——位号等于字节偏移乘以 8,再加上掩码在该字节内从高位往低数的序号。

信号 字节偏移 位掩码 掩码在字节内的高位序号 RaceChrono 位号 RaceChrono 公式
空挡 0 0x80 0 0 (1 – BitsToUInt(raw, 0, 1)) * 100
手刹 4 0x40 1 33 BitsToUInt(raw, 33, 1) * 100
刹车踏板 5 0x08 4 44 BitsToUInt(raw, 44, 1) * 100

三个位号都能对上:0 = 0×8+0,33 = 4×8+1,44 = 5×8+4。三个开关量都乘 100,是为了把布尔量塞进 RaceChrono 的百分比通道。空挡那一项额外做了取反:原始位在空挡或踩离合时为 0,其余情况为 1。

两处未定系数与一处待办

笔记里真正需要用户在落地时做判断的,是笔记公式与 RaceChrono 公式不一致的地方。这些差异大多有明确原因(单位制不同),唯独转速那一处被原作者标记为「需要调查」。

信号 笔记公式 RaceChrono 公式 差异原因 是否待定
引擎转速 值 / 4.0 值 / 3.85 4.0 是标准公式,3.85 更贴合仪表显示 是,原作者标注需调查
车速 (值 – 10000)/ 100.0 得 km/h (值 – 10000)/ 360 RaceChrono 需要 m/s,故除以 360 而非 100 否
冷却液温度 值 – 40 得摄氏度 值 – 40 RaceChrono 自动转换为华氏度 否
进气温度 值 – 40 得摄氏度 值 – 40 RaceChrono 自动转换为华氏度 否
转向角 值(有符号) 值 × -1 RaceChrono 需取反才能正确显示转向动画 否
刹车压力 无 无 笔记 TODO:希望以压力量替代开关量 是,尚未找到

转速除数为什么不能随手选一个

4.0 与 3.85 在 7000 rpm 处的差值约 273 rpm,足以让换挡提示与圈速分析出现系统性偏差。笔记明确写到除以 4 是标准公式,但 3.85 看起来更接近车辆仪表显示的值,而作者并未判定哪个正确。落地时的合理做法是用仪表或独立转速计做一次标定,而不是沿用其中任意一个。

车速公式里的 10000 偏移

车速要先把原始值减掉 10000 再除以 100,说明这条通道带了一个 10000 的零点偏移,而不是从 0 计起。这样的设计让原始值具备表达负速度(倒车)的余量,但也意味着如果直接把该 uint16 当无符号数解释而忘记减偏移,会得到约 100 km/h 的固定假值。落地时应先确认目标工具是按有符号还是无符号取值,并在静态停车状态下先读一次原始值做零点校验。

验证环境与适用边界

这套代码带的免责声明写得很直接:仅供实验用途,使用风险自负。它的验证矩阵也很窄,只有一台车、一个适配器、一个手机型号与一个软件版本。

项目 取值 对适用性的影响
车辆 Mazda RX-8 2006(series 1),手动变速箱,带 DSC 自动挡或其他年款未验证
适配器 OBDLink MX+ 蓝牙扫描仪 换适配器后需重新确认透传是否完整
手机 Huawei P30 Pro,Android 10 蓝牙协议栈差异可能影响采样连续性
软件 RaceChrono v7.5.3,需开启实验功能 7.5.3 起必须启用实验特性才能生效
字节序 多字节值为大端 按小端解析会得到完全错误的速度与转速
位编号 从最高位起算,范围 0 到 63,位 57 的权值为 64 与常见 LSB 起算工具不通用

常见问题

这里的 PID 是 OBD-II 的 PID 吗?

不是。笔记里的 PID 指 CAN 报文 ID,例如 0x201、0x212、0x231、0x420、0x250、0x81,取数方式是被动监听总线而不是主动请求应答。这与 OBD-II 服务 01 下的参数标识符是两套体系,混用会得到完全不同的字节布局。

这些报文适用于所有 RX-8 年款吗?

不能这样假定。笔记声明只在 Mazda RX-8 2006(series 1)、手动变速箱、带 DSC 这一台车上验证成功,并明确为实验用途。自动挡、其他年款或不同市场版本的报文布局可能不同。

引擎转速为什么会有 4.0 和 3.85 两套除数?

笔记写到除以 4 是标准公式,但 3.85 看起来更接近车辆仪表显示的值,作者自己也标注「不知道哪个是对的,需要调查」。两者在高转速区的差值可达数百 rpm,落地前应用仪表或独立转速计做一次标定。

RaceChrono 里的位号 44、33、0 是怎么算出来的?

由字节偏移与位掩码换算而来。RaceChrono 从最高位起算,位号等于字节偏移乘 8 再加掩码在字节内从高位往低数的序号:刹车 0x08 在偏移 5,得 5×8+4 = 44;手刹 0x40 在偏移 4,得 4×8+1 = 33;空挡 0x80 在偏移 0,得 0×8+0 = 0。

刹车压力能从这些报文里取到吗?

暂时不能。笔记只解出了 0x212 里的刹车踏板开关量与手刹开关量,并把「找到刹车压力代替开关信号」列为 TODO。也就是说目前只有布尔状态,没有连续的制动压力通道。

延伸阅读

参考资料

  • 项目 01 —— public-can-dbc-datasets/additional/topolittle-rx8-can-notes/README.md(9 个信号的报文 ID、字节偏移、位掩码、换算公式与验证设备清单)

免责声明

本文所述的 CAN 报文解析均来自公开仓库的实验性笔记,原作者明确声明仅供实验用途、使用风险自负,且与文中提到的任何公司无关联或赞助关系。文中数字未经独立实车验证,不同年款、市场与 ECU 版本可能存在差异。涉及安全相关用途时请仅作参考,并以实际测量与官方资料为准。

更新记录

  • 2026-10-14 初稿

评论

发表回复

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