求基于SAE J1939协议的OBD-II完整数据帧示例及通信规则答疑
SAE J1939 29位扩展ID字段构成
SAE J1939协议规定29位扩展ID按从高位到低位拆分以下字段,OBD诊断类请求按如下规则填充即可:
- 优先级(3位):诊断请求优先级固定填6,对应二进制
110 - 保留位(1位):默认填0
- 数据页(1位):普通OBD诊断报文填0
- PDU格式(8位):诊断请求类报文固定填
0xDA - PDU特定字段(8位):广播读PID时填全局目标地址
0xFF,指定单个ECU访问时填对应ECU的目标地址 - 源地址(8位):外部诊断设备的标准源地址为
0xF9,直接使用即可
按以上规则拼接,OBD广播请求的标准报文ID为0x18DAFFF9。
实际总线传输数据帧示例
以下是商用车J1939总线上读取发动机转速的真实通信帧:
请求帧(诊断工具发广播):
报文ID:0x18DAFFF9
数据段:0x03 0x01 0x0C 0x00 0x00 0x00 0x00 0x00
说明:0x03为有效数据长度,0x01对应OBD模式1(实时参数读取),0x0C为发动机转速的PID编号
响应帧(发动机ECU返回,ECU源地址为
0x00):
报文ID:0x18DAF900
数据段:0x04 0x41 0x0C 0x1A 0xF8 0x00 0x00 0x00
说明:0x41是模式1的响应标识,0x0C对应转速PID,0x1AF8换算为十进制后除以4得到实际转速1758rpm
OBD-II通信应答机制说明
- 11位标准ID的OBD-II通信:依赖CAN总线底层硬件自动应答,收到合法报文的节点会自动返回ACK位,应用层不需要额外实现应答逻辑,仅需配置超时重试机制即可,常规PID读取的超时阈值建议设为200ms,连续3次无响应可判定请求失败。
- SAE J1939协议下的OBD通信:单帧传输的短报文同样不需要应用层应答,仅当响应数据长度超过8字节需要多帧传输时,诊断工具需要在收到首帧后返回应用层流控帧,通知ECU可以发送后续连续帧。
内容的提问来源于stack exchange,提问作者Alex Ghilas
相关产品推荐
相关产品推荐

