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

本文介绍了UDS协议中的19 04服务,用于读取故障码快照。详细阐述了19服务的含义,04子服务的功能,以及快照存储和发送的设计。通过示例代码展示了如何实现快照的存储和发送,并讨论了UDS在嵌入式软件中的应用和适用场景。

文章目录

前言

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协议

        首先,诊断仪

以下是个简单的用C语言实现符合UDS协议0x19服务的示例代码。该代码模拟了对UDS 0x19服务的处理,包括接收请求和生成响应。 ```c #include <stdio.h> #include <stdint.h> // 定义UDS 0x19服务的子服务 #define UDS_SERVICE_19 0x19 #define UDS_SUB_SERVICE_REPORT_SUPPORTED_DTC 0x0A // 模拟DTC数据库 #define MAX_DTC_COUNT 10 uint32_t dtc_list[MAX_DTC_COUNT] = {0x112233, 0x445566, 0x778899}; uint8_t dtc_status[MAX_DTC_COUNT] = {0x04, 0x02, 0x01}; uint8_t dtc_count = 3; // 处理UDS 0x19服务请求 void handle_uds_service_19(uint8_t *request, uint8_t request_length, uint8_t *response, uint8_t *response_length) { if (request_length < 2) { // 请求长度不足,返回错误 response[0] = 0x7F; // 否定响应 response[1] = UDS_SERVICE_19; response[2] = 0x13; // 消息格式错误 *response_length = 3; return; } uint8_t sub_service = request[1]; if (sub_service == UDS_SUB_SERVICE_REPORT_SUPPORTED_DTC) { // 处理reportSupportedDTC子服务 response[0] = 0x59; // 肯定响应 response[1] = 0x02; // 子服务响应编号 response[2] = 0xFF; // 表示当前系统支持DTCStatus的全部8个bit uint8_t index = 3; for (uint8_t i = 0; i < dtc_count; i++) { // 写入DTC response[index++] = (dtc_list[i] >> 16) & 0xFF; response[index++] = (dtc_list[i] >> 8) & 0xFF; response[index++] = dtc_list[i] & 0xFF; // 写入DTC状态 response[index++] = dtc_status[i]; } *response_length = index; } else { // 不支持的子服务,返回错误 response[0] = 0x7F; // 否定响应 response[1] = UDS_SERVICE_19; response[2] = 0x12; // 服务不支持 *response_length = 3; } } int main() { // 模拟UDS请求 uint8_t request[] = {UDS_SERVICE_19, UDS_SUB_SERVICE_REPORT_SUPPORTED_DTC}; uint8_t request_length = sizeof(request); uint8_t response[256]; uint8_t response_length; // 处理请求 handle_uds_service_19(request, request_length, response, &response_length); // 输出响应 printf("UDS Response: "); for (uint8_t i = 0; i < response_length; i++) { printf("%02X ", response[i]); } printf("\n"); return 0; } ``` ### 代码说明 1. **UDS服务和子服务定义**:定义了UDS 0x19服务和`reportSupportedDTC`子服务的常量。 2. **DTC数据库模拟**:使用数组模拟了DTC列表和对应的状态。 3. **`handle_uds_service_19`函数**:处理UDS 0x19服务的请求,根据子服务类型生成相应的响应。如果请求格式错误或子服务不支持,返回否定响应。 4. **`main`函数**:模拟了UDS请求,调用`handle_uds_service_19`函数处理请求,并输出响应。 ###
评论 93
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Cssust

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

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

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

打赏作者

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

抵扣说明:

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

余额充值