数据链路层协议_ISO157654协议的代码实现数据链路层函数的验证(源自C300开发板教程)...

7.2.2 ISO15765-4协议程序实现

前面的SAEJ1939协议讲解的时候我们提到函数NL_OBD_SendCANFrame,如下图所示。

34ec0c5abfdaeb3c110b45f7ae0596cd.png

这个函数只要是基于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函数如何进行数据处理,并提取应用层原始数据。

1ae1c1002306bfcf1bf6c1f557f11663.png

模拟故障码P0143,看NL_OBD_SendCANFrame函数对SingleFrame的处理。

1.设置模拟器协议 ISO15765-4 11BIT 500K,并设置故障码 P0143。

ecf8844ee53c341ae8598fb7f7e9914a.png

67c85046014a620bb9745b39223e3be2.png

2.C300开发板读到的结果。

a65726492d7b95f35d17445e9bc55ef1.png

3.OBD分析仪采集到的读故障码原始CAN数据。

1bff0c0004cba9fba030cc8958c07937.png

4.在C300开发板工程代码中打断点,查看NL_OBD_SendCANFrame函数返回值指向的存储单元,如下所示。

1cee581e6839e556473b1d3159ecbb51.png

代码中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。

52244f8f92c20e4d204b9cceee834729.png

aaa5897b4ccb39e2319422497ed9b943.png

2.C300开发板读到的结果。 

d96e3d7baeffb834aee39be535f972de.png

3.OBD分析仪采集到的读故障码原始CAN数据。这时候只是CAN标识符和11BIT标准CAN不一样,数据域是一样的。

d2c615f6f4f17cd6c9a34b0a35dde61f.png

4.在C300开发板工程代码中打断点,查看NL_OBD_SendCANFrame函数返回值指向的存储单元的值和11BIT标准CAN是一样的。

1636d7f15ddbcd87a11a6cf7596a6048.png 所以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。

bb414c845b3eade0435535505a92d2f4.png

f86ea42c731d815b2eeb93c010a3291d.png

2.C300开发板读到的结果。

3de9e9313f8aeb58cdca1f2ae20b43b3.png 

3.OBD分析仪采集到的请求和响应MultipleFrame数据。

39673d66437a1744ff71c3cdc6bee848.png

4.在C300开发板工程代码中打断点,查看NL_OBD_SendCANFrame函数返回值。

dff7df249fb68b332c3d0cfa3c5ca4e6.png

函数返回值所指向的存储单元的值是 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红色框的值完全一致。

6343e95b5c5db4aef0071b234996fc80.png

至于 ISO15765-4 29BIT 500K 的扩展CAN协议,只是标识符的区别,NL_OBD_SendCANFrame函数处理效果如下图所示。

c6f0284a6a57c940ab1cc5f746bfd641.png

0c5b0cafc1b8244022ac7f38be160ba8.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值