1、基础知识
大家都了解
NRC0x13,表示长度错误和格式错误
NRC0x31,表示DID不支持和数据格式不支持
2、为什么说这两个NRC比较特殊
看下图的标注部分:
2.1、先看NRC0x13
步骤一:仔细看是先判断Minmun Length Check ,判断最小长度?什么是最小长度。最小长度意味着最简单的状态。
看过我之前一篇关于0x2F的同学知道,我讲解时举了个0x2F服务,控制车窗升降的例子,其中就提到可以为每一个车窗设置一个DID,我们采取以下报文来控制车窗:
0x 701 05 2F D0 03 01 32;
使用以下报文来返回控制给ECU
0x 701 04 2F D0 01 00;
于是第一个0x13,判断的最小长度 < 04时,我们就可以返回NRC0x13,
第二个NRC0x13,就需要根据具体的设置去判断了?
还是以控制车窗为例:
如果定义一个DID来控制多个车窗,则每个车窗ControlState对应的bit数,则不是一个固定数,你可以定义每个车窗使用7bit,也就是一个Byte来控制,但是你也可以用8bit、9bit来控制,没有限定。
而controlMask参数也是不是固定的,理论上,使用一个DID就可以控制车上所有的车窗。车锁。灯、电机、继电器等。只要控制的单位超过8个,controlMask也是可以大于一个字节的。
故这个最大长度不能超过我们设定的最大长度。
还是以一个DID控制四个车窗为例
0x 701 09 2F D0 03 03 32 32, 32 32 F0 55 55 55;(can_fd,0x55是填充数据)
这里的09就是我们设置该DID对应最大的长度。如果你发送
0x 701 0A 2F D0 03 03 32 32, 32 32 F0 55 55 55 ;can_fd,0x55是填充数据)
就会得到NRC 13的回复
2.2 、NRC0x31也是如此
大家自行参考规范,结合上文思考,和NRC0x13的思路一致
3、结论:
也就是说0x2F服务中,NRC0x13和NRC0x31并没有明显的优先级关系,这两个NRC是交叉的
4、再思考阅读规范
希望你能找出和0x2F中,NRC0x13和NRC0x31这样差不多的例子