7.2.2 ISO15765-4协议程序实现
前面的SAEJ1939协议讲解的时候我们提到函数NL_OBD_SendCANFrame,如下图所示。
这个函数只要是基于CAN总线通信的诊断协议,都被用来实现应用层协议以下的网络层协议,数据链路层协议等。函数的第一个参数用来表示当前执行的诊断协议,这里可以填写SAEJ1939,ISO15765_4STD_500K和ISO15765_4EXT_500K。上图中的程序片段有两个NL_OBD_SendCANFrame函数,第一个参数由pro赋值,这两个函数pro的值分别为ISO15765_4STD_500K和ISO15765_4EXT_500K,也就是使用这两个协议分别发送EntCmd15765命令。ISO15765-4协议除了定义500K传输速率外,还定义了250K速率,250K速率的ISO15765-4在实车测试中并没有发现,所以代码中我们仅讨论ISO15765_4STD_500K和ISO15765_4EXT_500K两种情况。
为了演示NL_OBD_SendCANFrame函数功能,根据ISO15031-5协议中Table148进行故障码模拟,看NL_OBD_SendCANFrame函数如何进行数据处理,并提取应用层原始数据。
模拟故障码P0143,看NL_OBD_SendCANFrame函数对SingleFrame的处理。
1.设置模拟器协议 ISO15765-4 11BIT 500K,并设置故障码 P0143。
2.C300开发板读到的结果。
3.OBD分析仪采集到的读故障码原始CAN数据。
4.在C300开发板工程代码中打断点,查看NL_OBD_SendCANFrame函数返回值指向的存储单元,如下所示。
代码中ram所指向存储单元的值为 04 43 01 01 43。其中43 01 01 43就是我们要取的应用层原始数据。第一字节04是我加进去用以表示有效字节的长度。所以NL_OBD_SendCANFrame函数可以正确处理ISO15765-4标准CAN的SingleFrame通信,而ISO15765-4扩展CAN的SingleFrame通信如下所示。
1.设置模拟器协议 ISO15765-4 29BIT 500K,并设置故障码 P0143。
2.C300开发板读到的结果。
3.OBD分析仪采集到的读故障码原始CAN数据。这时候只是CAN标识符和11BIT标准CAN不一样,数据域是一样的。
4.在C300开发板工程代码中打断点,查看NL_OBD_SendCANFrame函数返回值指向的存储单元的值和11BIT标准CAN是一样的。
所以NL_OBD_SendCANFrame函数可以顺利处理ISO15765-4 11BIT 和29BIT 的SingleFrame数据,并能提取应用层原始数据作为返回值。
模拟故障码P0143,P0196,P0234,P02CD,P0357,P0A24,看NL_OBD_SendCANFrame函数对MultipleFrame的处理。
1. 设置模拟器协议 ISO15765-4 11BIT 500K,并设置故障码 P0143,P0196,P0234,P02CD,P0357,P0A24。
2.C300开发板读到的结果。
3.OBD分析仪采集到的请求和响应MultipleFrame数据。
4.在C300开发板工程代码中打断点,查看NL_OBD_SendCANFrame函数返回值。
函数返回值所指向的存储单元的值是 0E 43 06 01 43 01 96 02 34 02 CD 03 57 0A 24。
第1字节是有效字节长度,这是我编写函数定义的,当前表示有14个字节用于应用层数据。
第2字节是故障码响应SID。
第3字节是故障码个数,06表示有6个故障码。
剩下的12个字节表示故障码,每两个字节组成一个故障码。
从第2字节开始的数据都是应用层的原始数据,因为当前模拟的故障码是按照ISO15031-5协议Table148模拟的,所以函数返回值所指向的存储单元的值0E 43 06 01 43 01 96 02 34 02 CD 03 57 0A 24与下图Table148红色框的值完全一致。
至于 ISO15765-4 29BIT 500K 的扩展CAN协议,只是标识符的区别,NL_OBD_SendCANFrame函数处理效果如下图所示。