SAE J1939协议读取车辆故障码

基于SAE J1939协议的车辆,默认开启数据广播。当有故障码时,也会按照故障码的格式进行广播。
此处基于外设主动:读取故障码个数->读取故障码->故障码解析 这个步骤来讲,如果被动接收故障码广播,如下解析也适用。

根据故障码个数分如下几种情况:
一、单个故障码时

读取故障码个数:
请求:18EA00F9 CE FE 00
响应:18FECE00 01 00 09 02 05 05 05 05
根据SAE J1939-73协议,解析响应如下:
在这里插入图片描述

01:当前激活故障码个数为1;
00:历史故障码个数为0;
09:符合EOBD、OBD和OBD II;
后面几个字节表明系统支持及状态。

有1个当前激活的故障码,下面去读取这个故障码
请求:18EA00F9 CA FE 00
响应:18FECA00 10 FF B8 04 03 0A FF FF
根据SAE J1939-73协议,解析响应如下:
在这里插入图片描述

10:亮红色停车灯;
FF:警示灯不闪烁;
B8 04 03 0A:一条故障码信息。
FF FF:填充。

根据SAE J1939-73协议,一个故障码信息包括4个字节,组成如下:
在这里插入图片描述
在这里插入图片描述
故障码信息解析如下:
在这里插入图片描述

十六进制(B8 04 03 02)转为
二进制(1011 1000 0000 0100 0000 0011 0000 0010)
则:SPN =(000 0000 0100 1011 1000)B=(4B8)H=(1208)D
	FMI =(00011)B=(3)D
	CM = 0
	OC = (0001010)B=(10)D
根据SAE J1939-71协议,查找SPN=1208的项,

在这里插入图片描述
根据SAE J1939-73协议附录,找到FMI=3的说明,
在这里插入图片描述

此故障码信息为:发动机机油滤清器前机油压力过高,亮红灯,已发生10次。

二、没有故障码时

读取故障码个数:
请求:18EA00F9 CE FE 00
响应:18FECE00 00 00 09 02 05 05 05 05

没有故障码,可以不用再去读取了。当然读取也可以,下面去读取故障码
请求:18EA00F9 CA FE 00
响应:18FECA00 00 FF 00 00 00 00 FF FF

	注意:未使用的字节7和8的应设置为FF(根据SAE J1939-21)。
	注意:当没有故障码时,此应答字节3到6应设置为零。

三、多个故障码时

读取故障码个数:
请求:18EA00F9 CE FE 00
响应:18FECE00 04 00 09 02 05 05 05 05

有4个当前激活的故障码,下面去读取故障码
请求:18EA00F9 CA FE 00
响应:18EC0000 10 12 00 03 FF CA FE 00

	10:为RTS请求应答广播;
	12 00:长度为18个字节;
	03:后续数据分3帧传送;
	CA FE 00:对应的请求PGN。

请求:18EC00F9 11 03 01 FF FF CA FE 00

	表明:准备好接收从编号 1 开始的3个数据包

响应:18EB0000 01 10 FF B8 04 03 0A 20
18EB0000 02 3F 01 03 02 51 11 01
18EB0000 03 12 3E 04 02 FF FF FF

4个故障码为:B8 04 03 0A,20 3F 01 03,02 51 11 01,12 3E 04 02
  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实现基于CAN的SAE J1939协议,可以分为以下几个步骤: 1. 定义J1939协议中的数据结构和常量,如PGN、SPN、SA等。可以在XXX.h中定义。 2. 初始化CAN总线,并配置相应的CAN控制器和滤波器,以过滤J1939协议中相关的PGN和SA数据。可以在XXX.h中定义初始化函数。 3. 实现J1939协议的数据解析和封装功能,包括CAN数据包的解析、SPN解析、PGN封装等。可以在XXX.h中定义相关函数。 4. 实现J1939协议的应用层功能,如DM1故障读取、DM2故障清除、TPD传输等。可以在XXX.h中定义相关函数。 下面是一个基于CAN的SAE J1939协议的框架,可以根据实际情况进行修改和完善: ```C #ifndef __J1939_H_ #define __J1939_H_ // 定义J1939协议中的常量和数据结构 #define J1939_CAN_ID_OFFSET 0x18EA0000 #define J1939_PGN_MASK 0x03FFFF00 #define J1939_PDU1_MASK 0xFF00 #define J1939_PDU2_MASK 0xFF #define J1939_PRIORITY_MASK 0x1C000000 #define J1939_PRIORITY_SHIFT 26 #define J1939_DATA_LENGTH_MASK 0x000F0000 #define J1939_DATA_LENGTH_SHIFT 16 #define J1939_MAX_DATA_LENGTH 8 typedef struct { uint32_t pgn; uint8_t priority; uint8_t data[J1939_MAX_DATA_LENGTH]; uint8_t data_length; uint8_t sa; } j1939_can_msg_t; typedef struct { uint8_t spn; uint8_t length; uint8_t data[8]; } j1939_spn_t; // J1939协议初始化函数 void j1939_init(void); // J1939协议数据解析函数 j1939_can_msg_t j1939_parse_can_msg(uint32_t can_id, uint8_t* data, uint8_t data_length); j1939_spn_t j1939_parse_spn(uint8_t spn, uint8_t* data, uint8_t data_length); uint32_t j1939_pack_pgn(uint8_t pdu_format, uint8_t pdu_specific, uint8_t data_page); uint32_t j1939_pack_can_id(uint32_t pgn, uint8_t priority, uint8_t da, uint8_t sa); // J1939协议应用层函数 void j1939_read_dm1(void); void j1939_clear_dm2(uint8_t fault_group); void j1939_send_tpd(uint8_t da, uint8_t sa, uint16_t tpd_index, uint8_t* data, uint8_t data_length); #endif // __J1939_H_ ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值