【转载】 ISO14229系列之二:诊断指令格式和相关概念
转载链接:http://www.cnblogs.com/autogeek/p/4458658.html
1. 简单的通信机制
其实诊断通信的机制很简单,可以类比client-server通信方式,即客户端发送request,服务器收到request之后进行处理,然后向客户端发送response。但是,诊断协议有自己的特色,它规定了在request和response的格式,在收到request的时候要做格式的检查。同时由于寻址方式的不同,有无sub-function的支持等,也会影响request和response的处理方式和结果。下面将我就具体情况分析,尽量做到简介明了。
2. Request
2.1 基本格式
归纳起来,诊断的request格式无非以下2种:
<SID> + <Sub-function> + <Parameter>
<SID> + <Parameter>
即有无sub-function的区别。其中,我把DID也归为Parameter
2.2 有sub-function
在介绍有sub-function情况的request之前,首先要了解一下sub-function的定义方法。下图是从ISO14229中截来的,它是对sub-function的定义。
值得注意的是Bit 7,从字面上来看它用来指示是否要抑制Positive Response。的确,它的目的就是这个意思,当Bit 7为1(1 = ‘true’)时,对该request的Positive Response要被抑制,即不发送Positive Response;当Bit7为0(0 = ‘false’)时,对该request的Positive Response不被抑制,正常发送。除了Bit 7,Sub-function有不同的值,具体的值和含义在协议中对每个服务的解释时都会有介绍。
2.3 不带sub-function
根据2.2的说明,不带sub-function的服务,就带parameter。Parameter可以是DID,可以是输入参数,可以是自定义的值,字节数目也是视具体要求而定。一般在协议内都会有表格,当遇到具体问题时,可查表确定。
3. Response
一般来讲,response会在一个服务被request且执行之后发送,成功的话就发positive response,失败的话要发negative response,但是也有例外的时候,比如ECUreset,他要求先发送response,然后再去执行具体的reset,因为如果先reset,那么ECU的通信模块shut down,是无法发送出去response的。一般像这种特殊情况,协议会在描述具体服务时标注出来。
3.1 Positive Response
基本格式:
<SID+0x40> + <Sub-function> + <Parameter>
<SID+0x40> + <Parameter>
其中要注意第一个字节是由SID和0x40的和构成,至于为什么要这样做,只能说协议就是这么规定的,只要是Positive的response,其第一个字节就是要由相应SID的值再加上0x40构成。这里的Parameter项是optional的,具体要看协议规定。
比如session control的service:
Send:10 01(byte1的10是SID,byte2的01是sub-function,且可知Bit 7是false)
Receive:50 01 (byte1是SID+0x40,byte2是sub-funtion)
再举个不带sub-function的例子,比如ReadDataById这个service:
Send:22 F1 86(byte1是SID,byte2和byte3是DID,可视为parameter的一种)
Receive:62 F1 86 01(byte1的62是SID+0x40,byte2和byte3是DID,byte4是读到的数据)
不论是物理寻址还是功能寻址,对于Positive Response来说都没有影响,只需要关注sub-function中的Bit 7 suppressPosRspMsgIndicationBit是0还是1,如果为0即false,那么正常发送即可,如果是1即true,那么就不发送response。如果根本没有subfunction呢,那么什么都不要考虑,肯定是要发送positive response的。
3.2 Negative Response
基本格式:
<0x7F> + <SID> + <NRC>
看起来比较简单,格式比较固定,只要是Negative Response,第一字节就一定是0x7F,第二字节照抄原来的SID,第三个字节是错误响应码,指示具体错误响应的原因,这个NRC可以在协议中查到,并且不同的服务所支持的NRC也有规定。
还是拿session control 这个service来举例:
Send:10 05(现在sun-function变为05了,假定系统不支持这个sub-function)
Receive:7F 10 12(7F即指代错误响应,10为SID,12是NRC,查协议可知其指代sub-function not supported 这个错误)
格式讲完了,来看看在物理寻址和功能寻址情况下,Negative Response分别有什么区别。
首先在物理寻址情况下,只要是Negative Response就应该按照规定格式发送。而在功能寻址情况下,有一点特殊,对于NRC为0x11(service not supported)、0x12(subfunction not supported)、0x31(request out of range)这三种情况,功能寻址是不会发送response的。
4. Request的检查策略
下面用一张流程图来展示收到request之后ECU如何检查他的合法性,并确定是正响应还是负响应,发送还是不发送。这里只是展示最基本的步骤,还有具体的和每个服务相关的条件判断,需要结合具体需求来讨论。
【转载】 ISO14229系列之二:诊断指令格式和相关概念的更多相关文章
- ISO14229系列之二:诊断指令格式和相关概念
作者:autogeek 原文链接:http://www.cnblogs.com/autogeek/p/4458658.html 1. 简单的通信机制 其实诊断通信的机制很简单,可以类比client-s ...
- 解密SVM系列(二):SVM的理论基础(转载)
解密SVM系列(二):SVM的理论基础 原文博主讲解地太好了 收藏下 解密SVM系列(三):SMO算法原理与实战求解 支持向量机通俗导论(理解SVM的三层境界) 上节我们探讨了关于拉格朗日乘 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
- 【转】RHadoop实践系列之二:RHadoop安装与使用
RHadoop实践系列之二:RHadoop安装与使用 RHadoop实践系列文章,包含了R语言与Hadoop结合进行海量数据分析.Hadoop主要用来存储海量数据,R语言完成MapReduce 算法, ...
- Android Studio系列教程二--基本设置与运行
Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...
- HDU 2042 不容易系列之二 [补6.24] 分类: ACM 2015-06-26 20:40 9人阅读 评论(0) 收藏
不容易系列之二 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- NGUI系列教程二
接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...
随机推荐
- Python中Swithch Case语法实现
而python本身没有switch语句,解决方法有以下3种:A.使用dictionaryvalues = { value1: do_some_stuff1, value2: do_some_stuff ...
- html表格表单标签的结合
今天我尝试将表格表单基本标签结合起来放在网页中,发现再没用表单元素中<form></form>时各类标签功能都可显示,只是不能提交网页,所有与提交网页的标签都不能使用提交功能, ...
- 每天一个JS 小demo之“随机”抽奖。主要知识点:Math函数,数组方法,递归
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
- php面向对象2
类与对象的区别和联系 通过 http://www.cnblogs.com/we-jack/p/object.html 和 http://www.cnblogs.com/we-jack/p/php.ht ...
- Unexpected end of input 和 Unexpected token var 和 Unexpected token ;
在写jsp的时候使用的一段代码一直调试,出现Unexpected token ; 错误. 所以最后把代码各种精简,得到了如下的测试示例代码 <% String aaa="123&quo ...
- Spring学习(12)--- @Autowired与@Resource 对比
Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource. @PostConstruct及@PreDestroy. 1. @Autowi ...
- php简单的文件操作
(1)先要想好要操作哪个文件? (2)确定文件的路径? (3)要有什么文件管理功能? 一.先做一下简单的查看文件功能,文件中的文件和文件夹都显示,但是双击文件夹可以显示下一级子目录,双击"返 ...
- 使用hashCode()和equals()方法 - Java
在这篇文章中,我将指出我对hashCode()和equals()方法的理解.我将讨论它们的默认实现以及如何正确地覆盖它们.我还将使用Apache Commons包中的实用工具类来实现这些方法. has ...
- 流畅的python学习笔记:第一章
这一章中作者简要的介绍了python数据模型,主要是python的一些特殊方法.比如__len__, __getitem__. 并用一个纸牌的程序来讲解了这些方法 首先介绍下Tuple和nametup ...
- php通过cURL下载网络上面的一个HTTPS的资源
<?php /** * php通过cURL下载网络上面的一个HTTPS的资源 * 案例:从google的CDN上下载jquery- v1.7.1 */ $curlobj = curl_init( ...