标签: ISO-TP

  • Honda CL250 诊断档案:5 个 DID 与 UDS 轮询

    结论:这份 Honda CL250(摩托车)档案的一个关键事实是:源文档目前没有已知的 CL250 广播报文——它的 cl250.dbc 是零报文、零信号的骨架。可用的数据来自主动 UDS 轮询 5 个 DID:转速、车速、节气门绝对位置、冷却液温度与电池电压,经 ISO 15765-2 单帧传输,主寻址是 29 位 0x18DA10F1(ECU 地址 0x10、测试仪 0xF1),回退到 11 位 0x7E0/0x7E8。工程约束也被写得很细:单请求在飞、基础超时 100 ms、响应挂起(NRC 0x78)翻倍超时、连续 5 次超时跳过该 DID 5 秒。下述内容仅限源文档记录的这一套定义。

    车辆与适用范围

    源文档来自一个摩托车车载平台项目,它把 CL250 的 ECU 定义与一张项目自建 CAN 分开管理。定义文件说明每个数值都从一份旧固件项目提取,而该旧固件自述「已在真实摩托车上验证过 CAN/UDS 通路」;但来源说明同时指出,那份被引用的仓库在核对时已无法公开访问,没有原始抓包被独立检查过,且部分轮询周期与 11 位回退寻址在源文档里明确标注为未验证。

    项 内容
    车型 Honda CL250(摩托车),ECU 记为 CL250_ECU
    年款 / 市场版本 源文档未给出年款与市场版本
    ECU / 改装状态 原厂 ECU;读取侧是一个测试仪节点(rt-core 或连接节点),只读轮询
    采集跨度 源文档未给出日志数;数值来源为一份旧固件项目的提取
    适用范围 仅限本套定义;被引用的旧固件仓库核对时不可公开访问,原始抓包未独立检查

    总线与寻址

    源文档把总线参数标为「已验证」的是经典 CAN 500 kbit/s;主寻址与回退寻址分开列出,并明确回退寻址「ECU 实际应答哪一个未被记录」。此外还列了两个只监视(watch-only)的功能地址,用于探测是否存在第二个测试仪。

    项 内容
    物理层 双绞线 CAN;经典 CAN(classic_can)
    链路层 / 比特率 500 kbit/s(源文档标 verified)
    主寻址 29 位固定寻址:请求 0x18DA10F1、响应 0x18DAF110;ECU 地址 0x10、测试仪 0xF1
    回退寻址 11 位:请求 0x7E0、响应 0x7E8;标为未验证(未记录 ECU 应答哪个)
    只监视地址 功能地址 0x7DF 与 0x18DB33F1,只看不发
    传输层 ISO 15765-2;帧 DLC=8;补齐字节 0xAA;旧固件只处理单帧

    已解码信号

    下表登记 5 个 DID 的解码,以及关键的服务与会话定义。DID 的公式与「已验证」标记按源文档原样保留;轮询周期一行给出旧固件值与平台建议值,并保留「平台值为暂定」的标注。

    信号 / 项目 位置(DID / 命令) 解码 / 说明 证据 / 置信度
    转速 ENGINE_SPEED DID 0xF40C(OBD PID 0x0C) (A×256 + B) / 4 → rpm,量程 0–16383.75 源文档标 verified;旧固件轮询 50 ms,平台建议 110 ms(暂定)
    车速 VEHICLE_SPEED DID 0xF40D(PID 0x0D) A → km/h,量程 0–255 标 verified;优先级 high;平台建议 110 ms(暂定),新鲜度 300 ms
    节气门绝对位置 THROTTLE_POS DID 0xF411(PID 0x11) A × 100 / 255 → %,量程 0–100 标 verified;平台建议 200 ms(暂定)
    冷却液温度 COOLANT_TEMP DID 0xF405(PID 0x05) A − 40 → °C,量程 −40–215 标 verified;平台建议 800 ms
    电池电压 BATTERY_VOLTAGE DID 0xF442(PID 0x42) (A×256 + B) / 1000 → V,量程 0–65.535 标 verified;旧固件的 A/10 启发式未沿用
    诊断会话 请求 0x10 0x03 → 正响应 0x50 扩展会话;未确认前每 2000 ms 重试 标 verified
    TesterPresent 0x3E 0x80 每 1000 ms 无条件发送(抑制正响应) 标 verified
    允许的服务白名单 0x10/0x3E/0x22/0x19/0x01/0x09 只读与会话类;禁止 0x11/0x14/0x27/0x2E/0x2F/0x31/0x34/0x36/0x37,并禁止 0x10 子功能 0x02 平台策略(D-020)
    功能地址监视 0x7DF、0x18DB33F1 只看不发;看到帧即说明存在第二个测试仪 标未验证(标准值,非取自旧固件)
    项目自建总线转发 dbc/platform.dbc 9 条报文、52 条信号;把轮询到的值再发布出去,不是 OEM Honda 库 来源说明

    读取方法与注意事项

    第一是时序预算。源文档记录:同时只有一个请求在飞(IDLE → WAITING → 完成/超时 → IDLE);基础超时 100 ms;收到 NRC 0x78(响应挂起)时重置并把超时翻倍、上限 2000 ms,且请求仍留在等待态;其它 NRC 则把请求判为完成。连续 5 次超时的 DID 会被跳过 5000 ms。ECU 只要在最近 3000 ms 内有过正响应或任何 NRC,就视为「在线」。

    第二是优先级。DID 被分成 high / normal 两类,在同时到期的请求里先服务所有 high(本例中车速为 high,因为它喂给上游的航向估计),列表顺序只作同类内的平局判定。源文档强调优先级只改顺序、不改内容,且每个到期 DID 仍须在其新鲜度窗口内被服务。

    第三是 ISO-TP 首帧陷阱。旧固件只处理单帧(PCI 高半字节 0x0);若收到首帧(PCI 0x1X),其 data[1] 是长度字段的一部分、不是 SID,按 SID 解析会破坏状态。旧固件直接丢弃非单帧帧;由于当前所有 DID 都能放进单帧,这只防未来响应变长。源文档据此写明:完整的 ISO-TP 多帧(首帧 + 流控 + 连续帧)需在新实现里从头做。

    第四是总线恢复。进入总线关闭后按指数退避重试:起始 1000 ms、每次翻倍、上限 30000 ms。

    证据等级与边界

    可视为「文档级已验证」的是 5 个 DID 的公式与主寻址,以及会话/超时/退避这些时序常量——它们都带证据引用。属于明确未验证的是:11 位回退寻址(未记录 ECU 应答哪个)、功能地址监视(标准值,非取自旧固件)、以及平台的轮询周期(源文档标注为暂定,与旧固件周期不同)。

    两处不能外推。第一,公式与 DID 只针对 CL250 这一辆车的 ECU 定义;换到其它 Honda 车型需要重新核对。第二,来源说明指出被引用的旧固件仓库在核对时已无法公开访问,原始抓包未被独立检查,因此「已在该车验证」属于源文档的转述,不是本项目的独立复现。

    关于「安全访问」类问题:源文档把 0x27(SecurityAccess)列为禁止服务,且未提供任何绕过方法,不建议尝试;本文只整理公开文档登记的只读轮询,不涉及写 ECU 或绕过安全机制。

    常见问题

    CL250 的报文能不能直接从总线上监听?

    源文档表示目前没有已知的 CL250 广播报文,cl250.dbc 是零报文、零信号的骨架;可用的数据来自主动 UDS 轮询 5 个 DID。

    轮询哪 5 个值?周期是多少?

    转速(0xF40C)、车速(0xF40D)、节气门绝对位置(0xF411)、冷却液温度(0xF405)、电池电压(0xF442)。旧固件周期为转速 50 ms、其余 800 ms;平台建议值为 110/110/200/800/800 ms,并标注为暂定。

    超时和响应挂起怎么处理?

    基础超时 100 ms;收到 NRC 0x78 时重置并把超时翻倍、上限 2000 ms,请求保持等待;其它 NRC 判为完成;连续 5 次超时的 DID 跳过 5000 ms。

    用 11 位还是 29 位地址?

    主寻址是 29 位 0x18DA10F1(响应 0x18DAF110);11 位 0x7E0/0x7E8 是回退,源文档标注为未验证——未记录 ECU 实际应答哪一个。

    延伸阅读

    参考资料

    • 项目 01 —— public-can-dbc-datasets/additional/moto-platform-cl250/docs/legacy-telemetry-notes.md(主来源:UDS 状态机、NRC 表、总线恢复与 ISO-TP 陷阱)。
    • 项目 01 —— public-can-dbc-datasets/additional/moto-platform-cl250/uds/vehicle_cl250.yaml(DID 定义、寻址、会话与轮询时序)。
    • 项目 01 —— public-can-dbc-datasets/additional/moto-platform-cl250/README.md(项目结构、平台总线与 CL250 骨架的区分)。

    说明:本文整理自第三方开源项目的公开文档,仅代表该文档所记录的单个车辆样本,不代表同型号全系车型。CAN 与诊断操作存在风险,任何实车操作前请自行复核并遵守当地法规。

    更新记录

    首次发布 2026-10-11 最近核对:2026-10-11

  • Ford Fiesta MK5 影音 CAN 档案:125 kbps 车身信号

    结论:这份档案的对象是2006 年以后的 Ford Fiesta MK5(改款,配 2-DIN 与 6000CD 收音机)的影音 CAN(MS-CAN)。它的数据特征是「低速、易接入、以车身与影音信号为主」:总线速率 125 kbps,从收音机 QuadLock 连接器的 CANH/CANL 即可旁听,不需要 120 欧姆终端电阻;可见内容包括仪表显示屏文字(经 ISO-TP)、电台名、音量、CD 状态、时间、车门/车灯/挡位/踏板等。源文档只覆盖这一台改款 Fiesta 与这台 6000CD 收音机,且其定义文件不完整,部分报文只做到部分解码;下述结论不外推到其他年款或配置。

    车辆与适用范围

    源文档是一份逆向记录:作者以「截取收音机送给仪表 LCD 的文字」为起点,顺带解出若干其他报文。以下范围仅对应这一台车与这台收音机。

    项 内容
    车型 Ford Fiesta MK5,2006 年以后(MK5 改款),配 2-DIN 与 6000CD 收音机
    年款 / 市场版本 源文档以「>2006 改款」界定;其他年款与市场版本未确认
    ECU / 改装状态 无改装;在收音机 QuadLock 连接器的 CANH/CANL 上旁接一块 CAN 扩展板
    采集跨度 源文档未提供日志时长或帧数
    适用范围 仅这一台改款 Fiesta 与 6000CD 收音机的影音 CAN;定义文件不完整,部分报文仅部分解码

    总线与寻址

    源文档对物理层描述简练而具体:接入选定在收音机端,且对终端条件有明确说明。

    项 内容
    物理层 / 比特率 MS-CAN,125 kbps
    寻址 / 帧格式 源文档列出的 ID 均为 11 位标准帧(0x080–0x4F3)
    接入点 收音机 QuadLock 连接器的 CANH/CANL
    终端 不需要 120 欧姆终端电阻(源文档明示)
    CAN FD 源文档未提供(该年代与总线类型指向经典 CAN)
    传输层 仪表文字使用 ISO-TP(ISO 15765-2)分帧,含单帧与首帧/连续帧/流控

    已解码信号

    下表抽取源文档中最有代表性的条目(车身状态、影音与仪表文字)。位置列保留原文 ID 与字节序号,解码列保留其换算公式;证据列注明源文档对该条目的完成度或限定。

    信号 位置(ID / 字节) 解码 证据
    日期时间 0x080 / 字节 1–6 年(两位)、月、日、时、分、秒;1 秒分辨率 车载 RTC 独立于收音机时钟
    电台名 0x1E9 / 8 字节 ASCII 文本 完全解码
    转速 / 车速 / 油门 0x201 / 字节 1–2、5–6、7–8 km_h = speed/100;gas_percent = gas*100/50944 部分字段未标注
    转向灯箭头 0x265 / 字节 1 位掩码:左 0x20、右 0x40 位掩码按需相加
    前灯 / 手刹 0x286 / 字节 1 位掩码:手刹 0x10、示宽/近光 0x80、远光 0x40 示宽与近光共用同一 LED,无法区分
    音量 0x2D8 / 字节 2 volume = volume_raw/8 完全解码
    CD 状态 0x2DA / 字节 2、4 模式 0x2A/0x4A/0x6A;驱动器 0x23/0x21/0x22/0x26 枚举表完整
    CD 曲目 / 时间 0x2DB / 字节 3–4、6 曲目时间 track_seconds = track_time - 64;另含 track_id 非播放时为全 FF
    方向盘模式/选台键 0x2D5 / 字节 2 位掩码:模式 0x10、上选 0x40、下选 0x80 音量键不经此报文
    制动状态(一) 0x360 / 字节 6 未踩 0x60、轻搭 0x68、踩下 0x78 同一状态在两报文重复
    冷却液 + 制动(二) 0x420 / 字节 1、6 coolant_degrees = coolant - 40;制动 0x00/0x10/0x30 两处制动编码不同
    蓄电池电压 0x428 / 字节 2 battery_v = battery/10(十分之一伏) 完全解码
    车门 / 倒挡 / 锁止 0x433 / 字节 1、4、6 门位掩码:左前 0x80、右前 0x40、后备箱 0x08;倒挡 0x02;锁 0x10/解锁 0x20 位掩码完整
    仪表文字 0x4C0 / 短格式与扩展格式 短格式:0x07 0x34 + ASCII;扩展格式:首帧 0x10 + 长度 + 0x34,连续帧 0x21 + ASCII 为 ISO-TP;配套 0x4C8 流控
    车辆识别(VIN 低位) 0x4F3 / 8 字节 周期性广播的车辆 ID(VIN 低位,含生产日期信息) 完全解码

    读取方法与注意事项

    接入非常直接:源文档说明只需把 CAN 接口接到收音机 QuadLock 连接器的 CANH/CANL,无需 120 欧姆终端电阻。这一条与多数两节点试验台的接线习惯相反,源文档把它作为结论明确写出,实际接线时不要凭经验加终端。

    仪表文字那一类是ISO-TP(ISO 15765-2)传输:短格式只在收音机切到 AUX 模式时可见,形如「首字节标志 + 0x34 + ASCII」;扩展格式由一条含文本长度的首帧加若干条提供后续文本的连续帧组成。响应里随后出现的 ACK 报文提供流控:字节 1 为 0x30 表示「可继续发送」,字节 2 为 0x00 表示不做分帧流控,字节 3 为 0x00 表示按发送方最快速度。解析这类文本时,必须按 ISO-TP 的帧类型分别处理,而不能把每条 ID 当独立报文读。

    还有一处容易混淆:制动状态在两条报文里重复出现但编码不同——0x360 用 0x60/0x68/0x78,0x420 用 0x00/0x10/0x30。同一物理状态的多套编码要求解析方选定一个来源并保持口径一致。此外,音量键并不经方向盘那条报文(0x2D5 只覆盖模式与选台键),源文档对此如实标注为「似乎如此」。

    证据等级与边界

    本文属于单台实车逆向观测:ID、字节与换算公式均可在源文档逐条核对,属于直接证据;但源文档没有给出采集时长、帧数或时序,也未声明校验与计数器机制(除 ISO-TP 流控外)。随文档提供的定义文件(某类商业诊断工具的 .kcd 格式)源文档明确标注为不完整,因此不能把它当作完整协议描述。

    两点不能外推。第一,全部内容来自一台「2006 年以后改款」的 Fiesta 与一台 6000CD 收音机;换成其他年款、其他市场版本或其他音响配置,ID 与编码都可能不同。第二,多个报文只做到部分解码,源文档用「unspecified」标记了未解析字节;把这些字节当作已知信号会超出源文档证据。关于安全访问,源文档未提供任何绕过方法,且不建议尝试;本文只整理只读旁听所能看到的内容。

    常见问题

    接入这条总线要不要加 120 欧姆终端?

    不需要。源文档明确:把 CAN 接口接到收音机 QuadLock 的 CANH/CANL 即可,不用终端电阻。这与多数两节点试验台的接线习惯相反,接线时按源文档结论来,不要凭经验加终端。

    仪表屏的文字是怎么传的?

    走 ISO-TP(ISO 15765-2)。短格式如同「0x07 0x34 + ASCII」,只在 AUX 模式可见;扩展格式由带文本长度的首帧(0x10 + 长度 + 0x34)加若干连续帧(0x21 + ASCII)组成,随后有 0x4C8 流控 ACK。解析时必须按 ISO-TP 帧类型分别处理。

    为什么同一制动状态有两种编码?

    因为在源文档里它被两条报文重复承载:0x360 用 0x60/0x68/0x78,0x420 用 0x00/0x10/0x30。这是源文档记录的实际状态,解析时应选定一个来源并保持口径一致,不要混用两套编码。

    随文档提供的定义文件能当完整协议看吗?

    不能。源文档明确标注该文件(某类商业诊断工具的 .kcd 格式)不完整,多处字节以「unspecified」标记为未解析。把它当作完整协议描述会引入未经证实的字段。

    延伸阅读

    参考资料

    • 项目 01 —— public-can-dbc-datasets/additional/roncapat-ford-fiesta-mk5/README.md(本项目车型档案主来源:总线速率、接入方式、全部已解码 ID 与换算公式)。

    说明:本文整理自第三方开源项目的公开文档,仅代表该文档所记录的单个车辆样本,不代表同型号全系车型。CAN 与诊断操作存在风险,任何实车操作前请自行复核并遵守当地法规。

    更新记录

    首次发布 2026-10-11 最近核对:2026-10-11

  • ECU 探测与 ISO-TP:在场、固件候选与可执行是三件事

    结论:诊断链上的三个结论必须严格分开——「探测到响应」「解析到固件」「车型可执行」是三件不同的事。tester present 收到单帧响应只说明该地址在场,返回固件候选只说明查询有结果,二者都不构成车型可执行的许可。此外 get_ecu_addrs() 的 timeout 是循环条件而非硬墙钟上界,0x78 的 pending 判断只看第三个字节、是宽松的超时延长条件而非已认证的 UDS pending 状态。本文为固定源码快照 c8fb906 的静态阅读,未连接 CAN 设备、未发送任何诊断请求。

    发现链路:从在场探测到品牌排序

    make_tester_present_msg() 生成 0x3e 0x00 服务请求,诊断 RX 地址由 get_rx_addr_for_tx_addr() 按 11-bit 偏移或 29-bit 地址字节交换计算。get_ecu_addrs() 先排空接收,再批量发送 tester present,在时间窗口内收集允许的响应地址与总线。

    函数/组件 输入与实际行为 输出边界
    get_present_ecus() 从各品牌 FwQueryConfig 取 ECU 地址,按 OBD 复用模式分组;无子地址并行、有子地址逐个查询 返回已响应的 (rx_addr, subaddr, bus) 集合;未响应不等于 ECU 不存在
    get_ecu_addrs() 排空接收、批量发 tester present,在时间窗口内收集允许的响应地址/总线 异常被记录后返回已收集的局部集合,不是全有或全无事务
    _is_tester_present_response() 验证短单帧格式;接受 SID 0x7e 正响应或 0x7f 0x3e 负响应 「ECU 在场」不表示该 ECU 接受诊断会话或会返回固件
    get_brand_ecu_matches() 将探测地址与各品牌预期 RX 地址比较 只作查询顺序启发;实现明确未比较 bus
    get_fw_versions_ordered() 按已命中 ECU 数与比例排序,仅查询有命中的品牌,单一固件候选即停止 不是全品牌全 ECU 的完整清单;早停可由 fuzzy 单一候选触发

    这里有两个容易被忽略的边界。其一,get_ecu_addrs() 的 timeout 是循环条件,而 can_recv(wait_for_one=True) 可阻塞,因此该值不是整个扫描过程的硬墙钟上界;经 card 的回调使用时订阅端设置了 timeout=20。其二,OBD 复用切换由参数写入及 pandad 确认构成,回调内没有独立握手超时。

    独立开发工具 get_all_ecu_addrs() 枚举 11-bit 与 29-bit 发送地址,但直接把 queries 复用为 responses:11-bit 枚举覆盖整个 0x700..0x7ff 范围,29-bit 通常需要交换后的 RX 地址。因此按代码推导,该工具的 29-bit 响应多数不会通过白名单,并非可靠的完整 ECU 清单;生产用的 get_present_ecus() 是单独计算预期 RX 地址的另一条路径。

    ISO-TP 查询状态机

    IsoTpParallelQuery 把 TX 地址映射成预期 RX 地址,按总线与地址过滤,子地址再逐条筛选;get_data() 用每地址计数器校验多阶段请求的响应前缀,最终只返回成功完成的 (tx_addr, subaddr) -> payload。VIN 的功能寻址先发广播请求,随后由物理寻址的 ISO-TP 对象接收/发流控;固件查询通常用物理地址。

    层 职责 边界
    CanClient 按 bus/RX 地址过滤,处理子地址和发送节拍 只对匹配地址的帧做后续处理
    IsoTpMessage 单帧、多帧、连续帧序号及流控;固件查询设为非阻塞接收、10 ms separation time 发送与接收错误可被上层记录并使对应地址结束
    get_data() 每地址计数器校验多阶段响应前缀 只返回成功完成的结果,部分成功不返回
    pending 分支 响应第三字节为 0x78 时延长该地址等待 只看第三字节,不先要求完整负响应前缀,属宽松条件

    正常多帧进展会刷新单地址截止时间;响应的第三字节为 0x78 时走 pending 分支并延长等待。关键在于 pending 判断仅按第三字节,不先要求完整负响应前缀 0x7f ... 0x78,所以它是宽松的超时延长条件,而非已认证的 UDS pending 状态。另外 total_timeout=60 也在循环尾检查,不能约束本次阻塞式 can_recv() 的耗时。

    固件数据契约

    get_fw_versions() 为每个成功响应创建 CarFw,记录 ECU 类型、固件字节、TX/RX 地址、请求、品牌、bus、OBD 复用模式及 logging。请求配置允许白名单、特殊 RX offset、子地址,以及需记录但不参与指纹匹配的 ECU。个别查询异常被捕获并继续,因此返回值可以是部分固件清单。build_fw_dict() 丢弃 logging 响应;匹配函数用地址/子地址与固件版本来判定,而不是把 CarFw 中的 bus 和响应地址都作为唯一身份校验条件。

    自制硬件与插件边界

    以下是改造建议,不是现有运行时的保证。应将 ECU 探测器、VIN 解码器、固件查询器拆成可替换的证据提供者,但对外只暴露受限的诊断代理;插件不得直接持有原始 sendcan 发布权限。诊断代理应对 bus、地址、服务 ID、速率、总时长、同时请求数和点火/行车状态实施硬限制,物理网关/MCU 独立保留 CAN 输出安全门。状态建模上,应把正/负响应、部分超时、未查询、OBD 模式切换失败分成不同状态,不以空集合或空固件列表直接推断「该车型不受支持」;每条证据应附采集时间、硬件拓扑和本次启动标识,缓存或早停结果不得自动获得执行许可。

    常见问题

    收到 tester present 响应就说明 ECU 支持诊断吗?

    不说明。_is_tester_present_response() 只验证短单帧格式并接受 0x7e 正响应或 0x7f 0x3e 负响应。「ECU 在场」不表示它接受诊断会话或会返回固件。

    0x78 的 pending 判断是标准 UDS pending 吗?

    不是。pending 分支仅按第三个字节是否为 0x78 判断,不先要求完整的负响应前缀,因此它是宽松的超时延长条件,而非已认证的 UDS pending 状态。

    get_fw_versions_ordered() 会返回全部 ECU 固件吗?

    不会。它按已命中 ECU 数与比例排序,只查询有命中的品牌,并在拿到单一固件候选时即停止,因此返回的是候选子集而非全品牌全 ECU 的完整清单。

    为什么 get_all_ecu_addrs() 的 29-bit 结果不可靠?

    因为它把 queries 直接复用为 responses,而 29-bit 通常需要交换后的 RX 地址,多数响应不会通过白名单。可靠路径是单独计算预期 RX 地址的 get_present_ecus()。

    延伸阅读

    参考资料

    • 项目 02 —— openpilot-research/ECU_DIAGNOSTIC_TRANSPORT_DEEP_DIVE.md(取用了 ECU 发现链、ISO-TP 查询状态机、固件数据契约、插件边界与离线探针结论)。
    • 项目 02 —— openpilot-research/CAR_MESSAGES_FIELD_CONTRACT_DEEP_DIVE.md(仅用于确认诊断结果进入车型识别与安全配置的衔接位置)。

    说明:本文为对固定源码快照的静态结构分析,未运行完整测试套件、未连接硬件、未验证目标车型的真实参数组合。文中所有阈值、行号索引与配置均出自源文档,标注为未验证的结论保留其原有边界。

    更新记录

    首次发布 2026-10-11 最近核对:2026-10-11

  • Honda Civic FL5:25 个 DID 与 109 个 CAN 信号

    结论:Honda Civic FL5 的数据特征与多数车相反:OBD 口后面存在网关,且总线上几乎抓不到周期性广播帧——必须用 UDS 服务 22(ReadDataByIdentifier)主动向四个模块索取 DID,才能读到 25 个 DID、109 个信号。正因为如此,DBC 不适合做这辆车的主格式。以下所有结论仅限源文档记录的这一台车与其固件版本,不代表同型号其他车辆。

    车辆与适用范围

    本文数据来自第三方开源项目对一台 Honda Civic FL5 的诊断数据整理。项目以 UDS 服务 22 的读取结果为基础,按模块组织成 DID 与信号清单,并对每条信号标注了证据等级。

    项 内容
    车型 Honda Civic FL5
    年款 / 市场版本 源文档未确认
    ECU / 模块 共 4 个:0x10 ECM、0x28 VSA、0x30 EPS、0x60 仪表(组合仪表)
    采集跨度 数据集 25 个 DID、109 个信号;源文档记录版本 1.0.1
    适用范围 仅限源文档记录的这一台车与其固件;DID 布局与信号刻度不保证适用于其他年款或市场版本

    总线与寻址

    这辆车是经典 CAN 加主动诊断读取的典型:总线上没有可供解析的周期广播流,价值的全部来源是「问—答」。因此寻址方式、传输层时序与请求节奏比 DBC 更重要。

    项 内容
    物理层 / 速率 经典 CAN 2.0B,500 kbit/s,无 CAN FD
    接入点 标准 OBD-II(J1962)引脚 6 / 14
    网关 OBD 口后存在网关;源文档实测总线上为零周期性广播帧
    诊断寻址 29 位 ISO 15765 物理寻址:请求 18DA<目标>F1,应答 18DAF1<目标>,诊断仪地址固定为 F1;功能广播为 18DB33F1
    传输层 ISO-TP(ISO 15765-2):首帧宣告长度,随后连续帧,接收方回 30 00 00 流控帧;数据区 54–63 字节,填充 0xAA
    11 位寻址 在 7E0 / 7E8 上发标准 Mode 01 无应答

    已解码信号

    下表从源文档的信号清单中抽取最具代表性的条目。项目的置信度分为「已确认(研究级)」「中」「低-候选」三档,表中原样保留该标注;标为「中」的条目表示解码方向明确但仍缺独立旁证。

    信号 位置(ID / DID / 字节) 解码 证据
    ENGINE_RPM(发动机转速) DID 0x2610 B6:B8 raw × 0.25 rpm 已确认(研究级)
    MAP_ABS(绝对进气压力) DID 0x2610 B9:B11 raw × 0.0078125 kPa 已确认(研究级)
    ECT(冷却液温度) DID 0x2610 B11 raw − 40 ℃ 已确认(研究级)
    VEHICLE_SPEED(车速) DID 0x2610 B18 raw km/h 已确认(研究级)
    OIL_PRESSURE(机油压力) DID 0x2610 B44:B46 raw kPa 已确认(研究级)
    OIL_TEMP_MODEL(机油温度模型) DID 0x268F B15 raw − 40 ℃ 已确认(研究级);源文档标注该信号在公开资料中无先例
    BRAKE_PRESSURE(制动压力) DID 0x4005 B7:B9 raw − 25 bar 已确认(研究级)
    STEER_ANGLE(方向盘转角) DID 0x48BD B11:B13 s16 × 0.1° 已确认(研究级)
    WHEEL_SPEED_FL / FR / RL / RR DID 0x48C4 B23:B31 raw × 0.01 km/h 已确认(研究级)
    STEER_MODE(转向模式) DID 0x48AC B1 枚举 中
    FUEL_LEVEL(燃油液位) DID 0x7029 B12:B14 raw × 0.01 L 已确认(研究级)
    AMBIENT_TEMP(环境温度) DID 0x7028 B17 raw ℃ 已确认(研究级)

    读取方法与注意事项

    这辆车读数据必须走 UDS 服务 22。请求用 29 位物理寻址发到 18DA<目标>F1,模块在 18DAF1<目标> 上应答;诊断仪地址固定为 F1,功能广播是 18DB33F1。注意 11 位寻址(7E0 / 7E8)上的标准 Mode 01 在本车上没有应答。

    一旦某个 DID 的应答超过单帧容量,就会落到 ISO-TP 分段传输:模块先发一个首帧(形如 10 29 …)宣告总长度,再发若干连续帧,诊断仪需要及时回一个流控帧 30 00 00 授权它继续。源文档特别指出,流控帧如果晚回几毫秒,ECU 会放弃整笔传输——所以「问得到」不等于「收得全」,接收端的流控时机是硬约束。

    工程上还要考虑读取节奏:同一模块上多个 DID 需要轮流询问,模块之间(ECM / VSA / EPS / 仪表)也要分配请求配额,否则在高频轮询时容易触发超时或让 ECU 返回否定应答。源文档记录了若干次安全访问被拒的情形,未提供绕过方法,也不建议尝试。

    证据等级与边界

    项目的证据等级分「已确认(研究级)」「中」「低-候选」三档。已确认条目既有编码依据也有行为或参考交叉验证;「中」表示解码方向明确但缺少独立旁证;「低-候选」则是尚未闭环的猜测。本文抽取的信号以已确认为主,并原样保留了 STEER_MODE 的「中」标注。

    项目文档中有一节专门列出「已推翻的说法」,条目数量在三十条以上——说明这辆车的诊断数据在公开讨论里存在大量误传。阅读时要把「已推翻」与「已确认」严格分开,不要把早期猜测当作结论使用。

    边界上必须强调:25 个 DID 与 109 个信号全部来自这一台车的这一版固件。不同年款、不同市场版本的 DID 编号、字节偏移与刻度都可能变化;同一 DID 在不同固件下含义也未必一致。任何实车读取都应在目标车上逐条复核。

    常见问题

    为什么这辆车用 DBC 解析不出来东西?

    因为源文档实测其总线上没有周期性广播帧,OBD 口后还有网关。DBC 描述的是「谁在什么时刻广播什么布局的帧」,而这辆车的数据要靠 UDS 服务 22 主动索取,表现形式是「问—答」而非广播,所以 DBC 不适合作主格式。

    读一个 DID 需要满足哪些传输层条件?

    用 29 位寻址发请求到 18DA<目标>F1,模块在 18DAF1<目标> 应答;如果应答超过单帧,模块会先发 ISO-TP 首帧宣告长度,诊断仪必须及时回 30 00 00 流控帧。源文档指出流控晚回几毫秒 ECU 就会放弃整笔传输。

    标准差一点的信号还能用吗?

    要按证据等级区分。标为「已确认(研究级)」的可以直接用;标为「中」的(如 STEER_MODE)解码方向明确但缺独立旁证,使用前应自行验证;「低-候选」的不要作为结论。源文档对每一条都保留了原始标注。

    这些 DID 能套用到别的 Civic 上吗?

    不能。源文档的全部结论限定在这一台车与其固件版本上,且明确 DID 编号、字节偏移与刻度都可能随年款或市场版本变化。换车使用前必须重新读取并复核。

    延伸阅读

    参考资料

    • 项目 02 —— public-can-dbc-datasets/additional/caldis-honda-civic-fl5-dids/README.zh-CN.md(本项目车型档案主来源)
    • 项目 02 —— public-can-dbc-datasets/additional/caldis-honda-civic-fl5-dids/CHANGELOG.md(版本与已推翻说法的变更记录)
    • 项目 02 —— public-can-dbc-datasets/additional/caldis-honda-civic-fl5-dids/SOURCE.md(数据集版本与来源说明)

    说明:本文整理自第三方开源项目的公开文档,仅代表该文档所记录的单个车辆样本,不代表同型号全系车型。CAN 与诊断操作存在风险,任何实车操作前请自行复核并遵守当地法规。

    更新记录

    首次发布 2026-10-11 最近核对:2026-10-11