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

文章目录

前言

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工程,可以到笔者的主页查找和下载。


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

  • 83
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 93
    评论
### 回答1: Ubuntu 19.04(代号为Disco Dingo)是Ubuntu操作系统的一个版本,它于2019年4月发布。UDS代表Ubuntu开发峰会(Ubuntu Developer Summit),它是一个周期性的会议,Ubuntu社区的开发者与贡献者们聚集在一起,共同讨论、规划和决定下一个Ubuntu版本的特性和改进。 在Ubuntu 19.04中,提供了许多新功能和改进。首先,它基于Linux内核版本5.0,带来了更好的硬件兼容性和更高的性能。此外,它引入了GNOME 3.32桌面环境,带来更加现代化和直观的使用体验。 19.04的软件包也进行了更新和升级。例如,LibreOffice套件升级到了6.2.2版本,带来了更多的功能和改进。Ubuntu软件中心和更新管理器也得到了提升,使得软件的安装和管理更加方便。 此外,Ubuntu 19.04还加入了一些新的应用程序和工具。例如,GNOME日历和GNOME Todo应用程序,它们可以帮助用户更好地组织和管理日程和任务。另外,已经加入了斯纳普应用商店,从中可以获得各种应用程序的最新版本。还有一些其他小的改进和修复,以增强操作系统的稳定性和安全性。 然而,需要注意的是,Ubuntu 19.04是一个非LTS(长期支持)版本,它只提供9个月的支持。因此,如果您更看重长期支持和稳定性,那么建议选择Ubuntu 18.04 LTS版本。 ### 回答2: UDS是指Unified Diagnostic Services(统一诊断服务),是一种用于汽车电子控制单元(ECU)间通信的协议UDS的19 04服务是其中一种服务类型。 19 04服务主要用于读取DTC(故障码)信息。每当车辆的某个系统出现故障时,相关的故障码会被存储在相应的ECU中。而UDS的19 04服务可以通过诊断设备与车辆的ECU进行通信,读取故障码的信息。 使用UDS的19 04服务读取故障码有助于技师进行车辆的诊断和维修。通过读取故障码,技师可以确定车辆的具体故障,帮助他们更快地找到问题所在,并采取相应的修复措施。此外,通过19 04服务还可以获取到与故障码相关的其他诊断信息,如故障记录、故障现象等,为技师提供必要的参考和指导。 UDS的19 04服务的优势在于其高度标准化和通用性。作为一种国际公认的汽车通信标准,UDS的应用范围广泛,并且可以兼容各种不同厂商的诊断设备和车辆。借助UDS的19 04服务,技师可以利用同一套工具和通信协议,对不同厂家和型号的车辆进行故障码读取,实现更高效、更准确的诊断。 总之,UDS的19 04服务是一种通过统一诊断服务协议进行故障码读取服务。它提供了便捷、高效的方式,帮助技师快速、准确地诊断车辆故障,为车辆维修提供重要的参考和指导。 ### 回答3: UDS(Unified Diagnostic Service)是一种用于汽车诊断的标准化通信协议,其作用是提供一种标准的方式来进行汽车的故障诊断和维修。而"19 04服务"是UDS协议中的一种具体的服务类型。 19 04服务UDS协议中用于读取DTC(Diagnostic Trouble Code)的一种服务,其中DTC是用于诊断车辆故障的错误代码。19 04服务的主要作用是通过读取车辆的故障码来诊断汽车的故障。 当车辆发生故障时,汽车的故障灯会亮起,并且会存储相应的故障码。通过使用19 04服务,汽车维修人员可以读取和解析这些故障码,从而确定车辆出现的具体故障类型和位置。 19 04服务的工作原理是通过与车辆的电子控制单元(ECU)进行通信,发送相应的命令来获取故障码。一旦故障码被读取成功,维修人员可以将其与UDS标准中的故障码库进行对照,从而找到与之相关的故障信息。 通过使用19 04服务,汽车维修人员可以更加方便和准确地诊断车辆故障,从而快速解决问题。这有助于提高汽车的故障维修效率,减少维修时间和成本。 总之,19 04服务UDS协议中的一种服务类型,用于读取车辆的故障码。通过使用这种服务,汽车维修人员可以方便地确定汽车故障的具体类型和位置,提高维修效率,并提供更好的维修服务质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Cssust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值