CAN 总线与 J1939 解码器
车载网络分析工具 - 支持 DBC
CAN ID 解码器
解析 CAN ID,提取 J1939 参数,包括优先级、PGN、源地址和目标地址。
使用指南
本工具全面支持 CAN(控制器局域网络)和 SAE J1939 协议分析。CAN 是汽车和工业应用中的主流通信标准,而 J1939 则是专为重型车辆和非道路设备设计的上层协议扩展。
J1939 协议概述
SAE J1939 是基于 CAN 2.0B 29 位扩展标识符构建的高层协议。29 位 CAN ID 编码了多个参数,用于定义消息路由和优先级。
J1939 标识符结构
29 位标识符被划分为多个独立字段。从最高位到最低位依次为:优先级(3 位)、保留位/EDP(1 位)、数据页(1 位)、PDU 格式(8 位)、PDU 特定字段(8 位)和源地址(8 位)。这种编码方式可实现车载网络中的高效消息优先级排序和寻址。
参数组编号(PGN)
PGN 是 J1939 的基本寻址机制,用于标识所传输数据的类型和内容。PGN 由 PDU 格式和 PDU 特定字段导出,具体解释方式取决于消息使用的是 PDU1 还是 PDU2 格式。
当 PDU 格式小于 240(0xF0)时,消息为 PDU1 格式,采用点对点寻址,PDU 特定字段包含目标地址。当 PDU 格式大于等于 240 时,消息为 PDU2 格式,用于广播消息,此时 PDU 特定字段成为 PGN 的一部分。
信号提取方法
J1939 和 CAN 协议在 8 字节数据帧中编码多个信号。每个信号具有定义的起始位位置、位长度和字节序。本工具支持 Intel(小端序)和 Motorola(大端序)两种字节序约定。
物理值通过标准公式从原始信号值计算得出:物理值 = 原始值 × 系数 + 偏移量。这种转换将二进制传感器读数转换为有意义的工程单位,如温度、压力或速度。
常用 J1939 PGN
- PGN 65262 (0xFEEE) - 发动机温度 1:包含发动机冷却液温度、燃油温度和机油温度读数。
- PGN 61444 (0xF004) - 电子发动机控制器 1:报告实际发动机扭矩、驾驶员需求扭矩和发动机转速(RPM)。
- PGN 65265 (0xFEF1) - 巡航控制/车速:提供基于车轮和基于发动机的车速测量值。
- PGN 65269 (0xFEF5) - 环境条件:包含大气压力、环境温度和发动机进气温度。
- PGN 65263 (0xFEEF) - 发动机液位/压力:报告燃油供给压力、机油压力和冷却液压力。
应用场景
- ECU 开发:在嵌入式控制器开发和集成测试期间验证消息格式。
- 车辆诊断:分析实时 CAN 流量以排查通信问题并验证传感器读数。
- 车队远程信息:解析 J1939 数据用于油耗监控、发动机工时跟踪和预测性维护。
- 动力总成标定:提取发动机参数用于性能调校和排放合规验证。
- 协议学习:通过实际消息示例的动手解码学习 J1939 协议结构。
字节序约定
Intel(小端序)从最低有效位和字节开始,常用于 x86 处理器和许多现代 ECU。Motorola(大端序)从最高有效位和字节开始,是 CAN 和汽车应用中的传统方式。选择正确的字节序对于准确解释信号至关重要。
工具功能概述
本 CAN 总线解码器提供四个主要功能模块,满足各种车载网络分析需求:
- ID 解析:解析 29 位 J1939 扩展 ID 或 11 位标准 ID。提取优先级、PGN、源地址、目标地址和 PDU 格式信息。
- 数据提取:使用可配置的起始位、位长度和字节序从 8 字节 CAN 帧中提取信号值。支持有符号/无符号整数和 IEEE 754 浮点类型。
- 日志查看:解析多种格式的 CAN 日志文件,包括 Linux candump、Vector ASC 和 PCAN TRC。支持按 CAN ID 过滤并导出 CSV。
- DBC 解码:加载 Vector CANdb++ DBC 文件自动解码所有信号。浏览消息、搜索信号、查看节点并执行快速信号解码。
DBC 文件支持
DBC(CAN 数据库)文件定义了 CAN 通信的完整结构,包括消息、信号、节点和值描述。本工具完全支持 Vector CANdb++ 格式的 DBC 文件。
加载 DBC 文件后,您可以浏览所有已定义的消息及其周期时间和信号数量,按名称或单位搜索数千个信号,查看 ECU 节点及其发送的消息,并使用预定义的信号定义快速解码原始 CAN 数据。
DBC 解析器支持:消息定义 (BO_)、信号定义 (SG_)、节点声明 (BU_)、值描述 (VAL_)、注释 (CM_)、属性(包括周期时间和初始值)、Intel/Motorola 字节序、有符号/无符号值类型。
支持的输入格式
支持多种数据输入格式以提高灵活性:
- 十六进制空格分隔:字节用空格分隔的标准格式。示例:
FF 00 11 22 33 44 55 66 - 十六进制无空格:不带空格的连续十六进制字符串。示例:
FF00112233445566 - Base64:Base64 编码的二进制数据。示例:
/wARIjNEVWY= - C/C++ 数组:C 语言风格数组表示法。示例:
0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66
日志文件格式
日志查看器支持自动检测常见的 CAN 日志格式:
- Linux candump:
(1234567890.123456) can0 18FEF100#FF00112233445566 - Vector ASC:
0.000000 1 18FEF100x Rx d 8 FF 00 11 22 33 44 55 66 - PCAN Trace:
1) 1234.5 18FEF100 8 FF 00 11 22 33 44 55 66
传输协议支持
J1939 传输协议 (TP) 支持传输超过 8 字节的消息。启用 TP 重组可自动将多帧消息(BAM 和 CMDT)组合成完整的数据负载进行分析。