【研发日记】白话解读UDS协议(一)——19 04读取快照服务

news2024/11/17 21:34:18

文章目录

前言

19服务

04子服务

19 04协议

快照存储设计

快照发送设计

功能验证

分析和应用

总结


前言

        近期在一个嵌入式软件开发项目中,要按照UDS标准开发相关功能,期间在翻阅UDS标准时,周围同事都说很多地方晦涩难懂。所以利用晚上和周末时间,把这些内容标注了一下,用大白话把他们解释出来。后面会用若干篇文章把它总结分享出来,一方面备着将来翻看,另一方面也希望能够帮到这一领域的粉丝朋友们。

19服务

        在UDS中,诊断仪被认为是客户端,ECU被认为是服务端,所以ECU中的一项UDS功能就被叫做一项服务,19服务是UDS中读取DTC故障相关信息的一类子服务的总称。官方文档中的描述示例如下:

        19服务中包含了很多子服务,最常用的其实就只有两个,19 02子服务是读取故障码的,19 04子服务是读取故障码的快照的。本文主要解析19 04这个子服务。

04子服务

        快照(Snapshot),从字面上理解意思就是,快门触发的瞬间,记录下来这一时刻的各种信息。放在UDS中来讲就是,发生某一故障(DTC)时,记录并存储这一时刻的ECU信息,比如铅酸供电电压、工作温度、车辆档位、车速、里程、日历时间等等。19 04服务的作用就是支持诊断仪把这一快照信息,按照协议从ECU中读取出来。官方文档中的描述示例如下:

        对于我们开发19 04服务而言,就是在ECU中开发这一功能,实现存快照和发送快照的功能。

19 04协议

        首先,诊断仪向ECU发送19 04请求指令,格式如下:

        其中DTCMaskRecord[]是某个故障的故障码。DTCSnapshotGroupNumber是快照内容的分组号,就像快门中照片九宫格一样,每个部分都有一个编号。01代表第一个分组,02代表第二个分组,依次类推。如果想读取全部的快照内容,把DTCSnapshotGroupNumber设置为FF即可。

        然后,ECU向诊断仪发送快照内容,格式如下:

        DTCSnapshotRecordNumber这个字节表示快照记录的组号;

        DTCSnapshotRecordNumberOfldentifiers这个字节表示后面紧跟的DID的个数,这里如果出现了0x00表示一个未定义的未知个数或者异常个数,比如大于255溢出的数字;

        dataldentifier这两个字节表示后面数据的DID;

        snapshotData表示快照DID对应的具体数据。

快照存储设计

        直接上一段代码,在代码中注释,更加一目了然,示例如下:

main(void)
{
  //省略若干行代码
  if(Timer100ms == 1){
    for(i=0;i++;i<16)//遍历16个故障的状态
    {
      if((FaultArrayNow[i] == 1)&&(FaultArrayBefore[i] == 0))//如果有新发生的故障
      {
         FaultMask = setBit(i,1);
      }
    }
    if(FaultMask > 0){
      //按顺序存数据,每个Signal都要存在对应的Address上,因为还涉及到分组以及后面的读取解析
      SnapData[0] = getByte(FaultMask,0);
      SnapData[1] = getByte(FaultMask,1);
      SnapData[2] = Signal_01;
      SnapData[3] = Signal_02;
      SnapData[4] = Signal_03;
      //...
      SnapAddress += 1024;//与前一个快照的存储作地址偏移
      FlashErase(SnapAddress);
      FlashWreit(SnapAddress, SnapLength, &SnapData[0]);
      
    }
    
  }
  //省略若干行代码
  
}

        注:上述代码是精简后的示意代码,非正式代码。

快照发送设计

        直接上一段代码,在代码中注释,更加一目了然,示例如下:

main(void)
{
  //省略若干行代码
  if(Timer100ms == 1){
    if(SnapReadRequest == 1){
      switch DTC_Request
        case DTC0
          DTC_Order = 0;
          break;
        case DTC1
          DTC_Order = 1;
          break;
        case DTC2
          DTC_Order = 2;
          break;
        case DTC3
          DTC_Order = 3;
          break;
        case DTC4
          DTC_Order = 4;
          break;
        case DTC5
          DTC_Order = 5;
          break;
        case DTC6
          DTC_Order = 6;
          break;
        case DTC7
          DTC_Order = 7;
          break;
        case DTC8
          DTC_Order = 8;
          break;
        case DTC9
          DTC_Order = 9;
          break;
        case DTC10
          DTC_Order = 10;
          break;
        case DTC11
          DTC_Order = 11;
          break;
        case DTC12
          DTC_Order = 12;
          break;
        case DTC13
          DTC_Order = 13;
          break;
        case DTC14
          DTC_Order = 14;
          break;
        case DTC15
          DTC_Order = 15;
          break;
        
      for(i=128;i--;i>0)//遍历全部的快照存储模块
      {
        FlashRead(SnapAddress, SnapLength, &SnapData[0]);
        if((SnapData[DTC_Order] == 1) || SnapData[getByte-7] == 1))//匹配故障掩码
        {
          //匹配快照的数据分组
          if(Group_Request == 1){
            OutputResponse(59,4,DTC_Request,DTC_Staus,1,SignalNum,SignalID1,SnapData[3],SignalID2,SnapData[4],...SignalID497,SnapData[499]);
          }else if(Group_Request == 2){
            OutputResponse(59,4,DTC_Request,DTC_Staus,2,SignalNum,SignalID1,SnapData[500],SignalID2,SnapData[501],...SignalID998,SnapData[1000]);
          }else {
            OutputResponse(59,4,DTC_Request,DTC_Staus,0xFF,SignalNum,SignalID1,SnapData[3],SignalID2,SnapData[4],...SignalID998,SnapData[1000]);
          }
          break;
        }
        SnapAddress--;
        
      }  
      
    }
    
  }
  //省略若干行代码
  
}

        注:上述代码是精简后的示意代码,非正式代码。

功能验证

        如下是诊断仪向车身控制器请求快照的通信数据,示例如下:

分析和应用

        UDS诊断在嵌入式软件中的作用非常强大,特别是汽车领域的ECU软件,大部分都要求必须支持UDS功能,只是对整个UDS中的那么多服务有所裁剪。例如本文提到的0x19服务,官方本来是有24种子服务的,但是大部分车厂只要求ECU开发0x01、0x02、0x4、0x06、0x0A这五个即可,有的ECU甚至只要求开发0x02、0x4这两个。本文着重讲解的0x19 04服务,能够在ECU出现故障时,使工程师使用通用的诊断仪就能获取到更多的故障现场信息,这对分析问题是有很大帮助的。可以更方便地追溯分析问题原因,大大提高工程师的工作效率。

        在嵌入式软件中开发0x19 04服务,主要适用于成熟的或者量产化的软件项目,因为它的前提是需要先搭建UDS的网络传输层、会话层、服务层和应用层这一整套的基础框架,需要投入相当大的工作量,这显然不适用于小批量或者功能性的嵌入式软件项目。

总结

        以上就是本人在开发UDS 0x19 04服务时,一些个人理解和分析的总结,首先介绍了它的基本概念,然后展示它的设计示例和验证过程,最后分析了该服务的特点和适用场景。

        后续还会分享另外几个最近总结的UDS知识点,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。


        版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1567748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ObjectiveC-08-OOP面向对象程序设计-类的分离与组合

本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念&#xff0c;概念上简单来讲类是它是一组关系密切属性的集合&#xff0c;所谓的关系就是对现实事物的抽象。 上面提到的关系包括很多种&#xff0c;比如has a&#xff0c; is a&#xff0c;has some等&…

基于Java,SSM,html,Vue在线视频播放管理系统网站设计

摘要 基于Java, SSM, HTML, Vue的在线视频播放管理系统网站设计是一个利用Spring框架、SpringMVC、MyBatis&#xff08;SSM&#xff09;和前端技术HTML与Vue.js实现的多功能Web应用。这个系统旨在为用户提供一个便捷、高效的平台来上传、管理和观看视频内容&#xff0c;同时兼…

Spring与SpringBoot的区别

Spring是一个开源的Java应用程序框架&#xff0c;旨在简化企业级Java应用程序的开发。它提供了一个轻量级的容器&#xff0c;用于管理应用程序中的各个组件&#xff08;如依赖注入、AOP等&#xff09;&#xff0c;并提供了丰富的功能和模块&#xff0c;用于处理数据库访问、事务…

enqueue:oracle锁机制

实现锁的方式就是排队咯&#xff0c;那么排队就是有enqueue这么个结构来管理 管理锁的结构叫队列&#xff0c;即enqueue 所有和enqueue相关的函数都叫KSQ-- kernal service enqueue lock是从应用层面看到的锁&#xff0c;enqueue是oracle内部管理锁的一个结构。 可以用v$lock_…

ajax教程

文章目录 一、原生ajax1、AJAX 简介2、特点1&#xff09;优点2&#xff09;缺点 二、http协议1、概念2、Cookie和Session机制1&#xff09;Cookie2&#xff09;Session3&#xff09;报文 二、请求头1、概念2、常见请求头&#xff1a;3、Content-Type 三、AJAX使用1、详细操作2、…

vue快速入门(三)差值表达式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 插值表达式基本用法插值表达式常用公式 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

显示器and拓展坞PD底层协商

简介&#xff1a; PD显示器或者PD拓展坞方案中&#xff0c;连接显示设备的Type-C端口主要运行在DRP模式&#xff0c;在此模式下可以兼容Source&#xff08;显卡&#xff09;、Sink&#xff08;信号器&#xff09;、DRP&#xff08;手机、电脑&#xff09;模式的显示设备。 Sou…

维基百科:8个提升维基百科推广效果的优化技巧-华媒舍

维基百科是全球最大的在线百科全书&#xff0c;致力于向用户提供高质量、可靠的知识内容。想要让自己的文章在维基百科中获得更多的曝光度和推广效果&#xff0c;并非易事。为此&#xff0c;我们整理了以下8个提升维基百科推广效果的优化技巧。 1. 确保内容符合要求 维基百科对…

Quiet-STaR:让语言模型在“说话”前思考

大型语言模型(llm)已经变得越来越复杂&#xff0c;能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题&#xff0c;与人类不同LLM经常在推理中涉及的隐含步骤中挣扎&#xff0c;这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…

windows下安装iteliij Idea2023.3

首先从官网下载 下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 双击打开进行安装&#xff1a; 安装完成后&#xff0c;需要对Idea进行稍微处理下。使用我分享给大家的文件&#xff0c;操作以下步骤&#xff1a; 注意&#xff1a;不能打开IDEA软件。 进入到scripts中点击un…

Spring Cloud微服务入门(一)

微服务的演变过程 //controller 视图交互层 前端数据处理传给service //1.DAO RequestBody userDAO String id;String type; {"id":"lcs", "type":"lcs"} //2.GET请求 findUserById&#xff1f;id1&typelcsRequestParam String …

css3之3D转换transform

css3之3D转换 一.特点二.坐标系三.3D移动&#xff08;translate3d)1.概念2.透视&#xff08;perpective)(近大远小&#xff09;&#xff08;写在父盒子上&#xff09; 四.3D旋转&#xff08;rotate3d)1.概念2.左手准则3.呈现&#xff08;transfrom-style)&#xff08;写父级盒子…

Python脚本:给TXT文件中的地铁站名添加引号

Python脚本&#xff1a;给TXT文件中的地铁站名添加引号 在日常的数据处理工作中&#xff0c;我们经常需要对文本数据进行格式化和处理。今天&#xff0c;我们就来分享一个使用Python脚本对TXT文件中的地铁站名进行处理的小技巧&#xff1a;将每行的地铁站名字加上双引号。 需求…

创新指南|贝恩的产品经理RAPID框架:解决问题的分步指南,使决策过程既高效又民主

您是否曾发现自己陷入项目的阵痛之中&#xff0c;决策混乱、角色不明确、团队成员之间的冲突不断升级&#xff1f;作为产品经理&#xff0c;驾驭这艘船穿过如此汹涌的水域可能是令人畏惧的。应对这些挑战的关键在于采用清晰、结构化的决策方法。输入贝恩的 RAPID 框架&#xff…

基于8B10B的GT收发器PHY层设计(3)PHY层设计

文章目录 前言一、设计框图二、PHY层基本传输协议三、PHY_TX模块3.1、模块接口3.2、组帧状态机描述3.3、数据大小端问题3.4、字节对齐 四、PHY_RX模块4.1、模块接口4.2、大小端转换4.3、起始位4.4、结束位4.5、axis数据流恢复 五、LFSR伪随机码六、链路空闲时期处理 前言 上一…

宁盾入选“2023年度中国高科技高成长企业榜”多个榜单

4月1日&#xff0c;由【第一新声】联合【天眼查】启动“数字未来”系列之 2023 年度中国高科技高成长企业系列榜单正式发布。宁盾入选未来独角兽企业、网络安全领域高成长企业、信创产业最佳服务商、企业数字化标杆案例 4 个榜单。 该榜单旨在发现和挖掘被资本市场关注&#xf…

基于顺序表 --- 实现简易【通讯录】

1. 多文件操作 SeqList.h //用于定义顺序表的结构&#xff0c;增删查改等函数的声明 SeqList.c //用于实现增删查改等函数 Contact.h //用于定义通讯录的结构&#xff0c;通讯录中联系人的增删查改等函数的声明 Contact.c //用于实现通讯录中增删查改等函数 Test.h //用于测试…

重磅!openGauss6.0创新版本,带着新特性正式发布了!

&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; 中国DBA联盟(ACD…

最新社交相亲系统源码PHP

最新社交相亲系统源码PHP 安装环境&#xff1a; php7.2 mysql 5.7 框架&#xff1a; 后端thinkphp6 前端&#xff1a;jquery layui PC 移动端响应式 线上案例&#xff1a;https://cjr.oemsun.com/ 主要页面及功能预览 首页 相亲资料详情页 红娘跟进记录 海报、一键复制分…

实操:Dropzone.js实现文件上传

&#x1f3e0;官网 点我前往 &#x1f953;依赖 <script src"https://unpkg.com/dropzone5/dist/min/dropzone.min.js"></script> <link rel"stylesheet" href"https://unpkg.com/dropzone5/dist/min/dropzone.min.css" type&…