【转载】 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遍历指定城市的一周气温
处于兴趣,写了一个遍历指定城市五天内的天气预报,并转为华氏度显示.把城市名字写到一个列表里这样可以方便的添加城市.并附有详细注释 1 import requests import json#定义一个函 ...
- NLTK学习笔记(一):语言处理和Python
目录 [TOC] nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) ...
- Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker]
linux中的JDK为JDK8,tomcat为tomcat8 加入dubbo.war包 启动报错! Caused by: org.springframework.beans.factory.BeanC ...
- re 学习随便
. 任意一个字符 \转义字符 * 字符重复0--多次 + 字符重复1-多次 ? 字符重复0-1次 ^行首匹配 或者在一个字符集中表示取反 \$ 匹配字符串末尾 \b 匹配\w 与\w 之间的 \B ...
- php面向对象3
类的定义 基本定义 class 类名{ 访问修饰符 成员属性; 访问修饰符 成员方法; } 说明: ①类一定要class关键词修饰 ②类名的规范说明,使用大驼峰法 ③php 中,类名不区分大小写.但是 ...
- require 增量更新与版本管理
使用require.js 加载JS文件时,当JS文件有更新,可以通过更改全局版本号( urlArgs : 'v=1'),告诉浏览器加载新的文件. 但该方法虽然使用方便,但美中不足的是有些不需要更新的文 ...
- 关于前后端同构,我的一点思路和心得(vue、nodejs、react、模版、amd)
最近1年多,前后端同构慢慢变成一个流行词,也许很多人还停留在前后端分离的最佳实践道路上,但实际上又有一批人已经从简单的服务端渲染走向探索最佳前后端同构方案的路上了.不过,我只是膜拜后者的过客. 虽然大 ...
- java基础(System.err和System.out)
今天有位同事在使用System.err和System.out遇上了一些小问题. 看了些资料总结下: 1.JDK文档对两者的解释: out: "标准"输出流.此流已打开并准备接受输出 ...
- ListView实现下拉刷新和上拉加载功能
1 public class RefreshListView extends ListView implements OnScrollListener { private View mHeaderVi ...
- Vue实战Vue-cli项目构建(Vue+webpack系列之一)
用Vue比较长一段时间了,大大小小做了一些项目,最近想总结一下知识点,出一个Vue+webpack系列,先从项目构建说起--vue-cli. 由于是Vue+webpack这里就不赘述git那些东西,默 ...