作者:autogeek

原文链接: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系列之二:诊断指令格式和相关概念的更多相关文章

  1. 【转载】 ISO14229系列之二:诊断指令格式和相关概念

    转载链接:http://www.cnblogs.com/autogeek/p/4458658.html 1. 简单的通信机制 其实诊断通信的机制很简单,可以类比client-server通信方式,即客 ...

  2. Lucene7.2.1系列(二)luke使用及索引文档的基本操作

    系列文章: Lucene系列(一)快速入门 Lucene系列(二)luke使用及索引文档的基本操作 Lucene系列(三)查询及高亮 luke入门 简介: github地址:https://githu ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  5. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

  6. ES6+ 现在就用系列(二):let 命令

    系列目录 ES6+ 现在就用系列(一):为什么使用ES6+ ES6+ 现在就用系列(二):let 命令 ES6+ 现在就用系列(三):const 命令 ES6+ 现在就用系列(四):箭头函数 => ...

  7. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

  9. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

随机推荐

  1. margin和 padding 以及 float :left和float :right的介绍

    1.margin和padding的介绍 margin是外边距,padding是内边距,用CSS时首先要做的就是把所有标签的margin和padding清空.这样更容易控制布局和兼容浏览器. p li等 ...

  2. make_safe

    from django.utils.safestring import mark_safe mark_safe('<input type="checkbox" id=&quo ...

  3. svn和 android adt的 eclipse插件更新地址

    下边这两个插件的更新地址是每次安装android开发环境时都能用到的,为了方便在这里记录一下. android adt: http://dl-ssl.google.com/android/eclips ...

  4. 用Kolla在阿里云部署10节点高可用OpenStack

    为展现 Kolla 的真正实力,我在阿里云使用 Ansible 自动创建 10 台虚机,部署一套多节点高可用 OpenStack 集群! 前言 上次 Kolla 已经表示了要打 10 个的愿望,这次我 ...

  5. RTMP、HTTP、HLS协议比较

    RTMP HLS HTTP 直播协议一次看个够 直播从2016年一路火到了2017年,如今要在自己的App里加入直播功能,只要找一个现成的SDK就行了,什么拍摄.美颜.推流,一条龙服务.不过作为直播身 ...

  6. [Codeforces 1228E]Another Filling the Grid(组合数+容斥)

    题目链接 解题思路: 容斥一下好久可以得到式子 \(\sum_{i=0}^{n}\sum_{j=0}^{n}(-1)^{i+j}C_n^iC_n^j(k-1)^{ni+nj-ij}k^{n^2-(ni ...

  7. Linux下启动/关闭Oracle

    一.Linux下启动Oracle Linux下启动Oracle分为两步: 1)启动监听: 2)启动数据库实例: 1.登录服务器,切换到oracle用户,或者以oracle用户登录 [admin@dat ...

  8. 如何获取 C# 类中发生数据变化的属性信息

    一.前言 在平时的开发中,当用户修改数据时,一直没有很好的办法来记录具体修改了那些信息,只能暂时采用将类序列化成 json 字符串,然后全塞入到日志中的方式,此时如果我们想要知道用户具体改变了哪几个字 ...

  9. 讲一下java,c语言,c+和c++都是干嘛的,他们运行的软件都是哪些

    讲一下java,c语言,c+和c++都是干嘛的,他们运行的软件都是哪些 都是用于开发软件的,用于不同的方面.比如,淘宝的后台,是java做的.而腾讯的qq的后台服务器,是c和c++的.暴雪游戏的后台服 ...

  10. 快乐编程大本营【java语言训练班】第5课: java的数组编程

    快乐编程大本营[java语言训练班]第5课: java的数组编程 第1节. 声明数组变量 第2节. 创建数组对象 第3节. 访问数组元素 第4节. 修改数组元素 第5节. 多维数组 学习地址如下:ht ...