UDS学习笔记

本文深入解析UDS(统一诊断服务)中的PDU、SDU和PCI概念,阐述它们在通信中的作用。介绍了UDS请求命令的构成方式和常见响应码,以及UDS诊断服务如会话控制、ECU复位、安全访问等的功能和使用场景。此外,详细讲解了通过ID读写数据、清除诊断信息和读取故障码信息等关键服务的步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、SDU PCI PDU 三者之间的关系

PDU和相应层的协议有关,不同协议对应各自的PDU长度,用户的数据要进行通信必须封装到PDU中,实现对等层之间的信息交换。而用户数据可以理解为SDU,它的长度可能大于或者小于PDU,要想进行通信,则必须将SDU分割或者拼接为PDU长度。
PDU:协议数据单元,对等实体之间进行数据交换的载体,每个层都有各自PDU,上层调用,请求服务把本层的PDU传递到下层,下层接收上层PDU,并添加PCI,组成本层PDU;
PCI:协议控制信息,用于描述本层功能
土话:PDU包含PCI(协议控制信息)+SDU(用户数据)
如果SDU数据超过PDU发送的最大数据,分解成几个发送。
在这里插入图片描述

2、UDS预备知识

①、UDS请求命令4种构成方式。

SID
SID+SF(Sub-function)
SID+DID(Data Identifier)(读写用)
SID+SF+DID
其中安全标识符(Security Identifiers,SID),服务ID值($10、$27那种)
SF(Sub-function):子功能
DID:应该指具体读取哪一个寄存器的指。

②、常见的NRC(响应码)

0x11表示服务不支持;
0x12 subfunction不支持;
0x13 请求的长度不正确,或者格式不正确;
0x31 是请求超出范围;
0x33 安全拒绝
0x35 无效的秘钥
0x7E 是在当前会话下subfunction不支持;(应该是权限不够)
0x7F 是在当前会话下服务不支持。(应该是权限不够)
特殊NRC:78(RCRRP):表明请求消息被正确地接收,请求消息中的所有参数都是有效的,但是要执行的操作还没有完成,等待Server完成后,会重新发送NRC。

③、N_PUD类型

包含PCI+SDU(协议信息+数据单元)
在这里插入图片描述
在这里插入图片描述
STmin:体现了接收方的处理能力,处理CAN接收的速度
BS:体现了接收方的接收能力:软件buffer的大小
单帧、多帧传输具体步骤参考下面博客:
https://blog.csdn.net/dop102/article/details/80318141

3、常用的诊断服务

结合同事与网上资料,重点掌握以下11个
$10 Diagnostic Session Control(诊断会话)
$11 EcuReset(ECU复位)
$27 Security Access(安全访问)
$3E Tester Present(待机握手)。
$22 Read Data By Identifier(通过ID读数据)
$2E Write Data By Identifier(通过ID写数据)
$14 Clear Diagnostic Information(清除诊断信息)
$19 Read DTC Information(读取故障码信息)
$34 Request Download(请求下载)
$36 Transfer Data(数据传输)
$37 Request Transfer Exit(请求退出传输)
分类
在这里插入图片描述

①、$10 Diagnostic Session Control(诊断会话)

$10包含3个子功能,01 Default默认会话,02 Programming编程会话,03 Extended扩展会话,ECU上电时,进入的是默认会话(Default)
权限大小:扩展会话 > 默认会话
编程会话:仅用于解锁bootloader相关的诊断服务,即程序烧录。
备注:我们要写入数据/参数、读写诊断码,均要在扩展会话下。
Eg:
在这里插入图片描述

②、$11 EcuReset(ECU复位)

使ECU复位。

③、$27安全访问

类似手机的root权限,一般情况下,一些特殊数据用户是无法读取的,想要读取,必须要先使用$27服务解锁。
解锁流程:我们通过$27服务,加上一个子服务,再加上一个钥匙,这样的服务请求可以进行解锁。比如下面的例子,2n-1是一个子服务,通过首轮种子的请求,首轮ECU会返回67+01+AA+BB+CC+DD,AA~DD就是种子了。之后第二轮,诊断端会利用种子进行运算(利用整车厂的算法),生成k1(不一定是1个字节),那么发送请求,27+02+[k1]。ECU同样也会通过种子算出k2。当k1和k2匹配时,解锁(Unlocked)成功。
在这里插入图片描述
在这里插入图片描述
具体解释(忽略种子不一致)
Tester:02 27 05 00 00 00 00 00 安全访问,05子功能
ECU: 06 67 05 08 27 11 F0 00 肯定响应,回复了对应安全级别的种子
Tester:06 27 06 FF FF FF FF 00 发送密钥,4个FF。注意06是与05成对使用的。(2n-1与2n)
ECU: 03 7F 27 78 00 00 00 00 若为否定响应,7F+27+NRC
ECU: 02 67 06 00 00 00 00 00 若为肯定响应,通过安全校验

④、$3E Tester Present(待机握手)

例如$10服务,当我们切换非会话模式时,一个定时器会运转,如果一段时间内没有请求,那么到时间后,诊断退回到默认会话01(最低权限)。如果想要保持此模式,就需要使用$3E服务。
例子:
在这里插入图片描述
如果不需要响应,可以在加一个0x80,格式如下
02 3E 80 00 00 00 00 00

⑤、$22 Read Data By Identifier(通过ID读数据)

$22读数据,Request(请求):22+DID(Data Identifier,通常是两个字节)
Response(响应):62+DID+Data
在这里插入图片描述
DID有一部分已经被ISO 14229-1规定了。比如0xF186就是当前诊断会话数据标识符,0xF187就是车厂备件号数据标识符,0xF188就是车厂ECU软件号码数据ID,0xF189就是车厂ECU软件版本号数据标识符。

⑥、$2E Write Data By Identifier(通过ID写数据)

$2E写数据,Request(请求):2E+DID+Data
Response(响应):6E+DID
在这里插入图片描述
正确的顺序是10开头的帧请求、30开头的帧回复、21开头再请求、22开头继续请求、03开头回复确认。我们一帧一帧来看。
10 14根据ISO15765-2代表这是一组多帧中的首帧(属于传输层的信息),一会要发0x14=20个字节的有效数据。之后是2E+F190(代表这是VIN码)+VIN码的前3个字节。意思是作为外部工具,想写入一个VIN码数据。这件事情正常是发生在车辆下线时。
30 00 14是TP层(传输层)的信息,表示这是一个流控帧,ECU发出的,表示可以一直连续发,但连续帧最短的间隔时间要求是20ms。
21是TP层的信息,表示这是一个连续帧,序号为1。后面是VIN码的第4字节到第10字节。
22是TP层的信息,表示这是一个连续帧,序号为2。后面是VIN码的第11字节到第17字节。
03是TP层的信息,这里说的这个TP层的信息是传不到应用层的,即这是一个用完就会抛弃的信息。03的0表示这是一个单帧,3表示后面有3个有效字节。6E表示我们确认执行了2E服务的请求,这个请求写入的ID是F1 90,即VIN码。
注意:比如0xF190等DID不支持直接写入数据,需要用$10来进行会话转换。也就是说,对于写数据的请求,一般来说需要在一个扩展会话,和安全等级1的状态下才能进行。

⑦、$14 Clear Diagnostic Information(清除诊断信息)

清除(复位)DTC格式,它可以改变DTC的状态。DTC状态中的八个位,除bit4和bit6外均会被清零,包含当前故障(TestFailed)和历史故障(ConfirmedDTC)。bit4和bit6这两个testNotCompleted开头的会被强制置1。
3个FF代表清除所有DTC。
Request:14+FF+FF+FF;
Response:54 。
在这里插入图片描述

⑧、$19 Read DTC Information(读取故障码信息)

19服务是一套诊断服务中的重中之重。协议中篇幅长达63页,通信举例达到了18个。可以说没有19服务,就没有完整的UDS。
故障码包括四个大类,分别是PCBU,P是powertrain动力系统,C是Chassis底盘,B是Body车身,U是network通信系统。一个DTC信息占用4个字节。最后一个字节是DTC的状态。
DTMMiddleByte和DTCLowByte两个字节是我们熟知的类似P0047(ISO15031中的故障码)中“0047”的纯数字故障码。第一个字节在乘用车中,前两个bit代表P/C/B/U(动力/底盘/车身/网络)中的一个,之后六个bit+2字节表示数字,合在一起的样子形如“C01”。
第一个字节的前2个bit中,用00/01/10/11分别表示P/C/B/U。
组成:4字节:3字节DTC(前2位区分P/C/B/U)+ DTCSttatus
在这里插入图片描述
$19拥有28个子服务(Sub-Function)。常用的子服务有:
01 (读取符合掩码条件的DTC数量)(必须支持),后面的参数是DTC状态掩码,若为01表示我想读当前故障,若为08表示我想读历史故障,若为09表示当前故障和历史故障都想读。
在肯定回复时,组合应该是59(19+40) - 01 (子功能) - 09 (本ECU所支持的掩码条件)-01 DTC的格式(ISO14229-1为01) - 00 01 (目前满足条件的DTC有一个)
02(读取符合掩码条件的DTC列表及其状态)(必须支持),后面的参数是DTC状态掩码,解读同上。
在肯定回复是,59 - 02(子功能)- 09(本ECU所支持的掩码条件) - XX XX XX ( DTC,车厂定义 ) - 01 (这个故障码怎么了,01表示当前故障)
04(读取快照信息),也叫冻结帧。
06(读取扩展信息)。
0A(读取ECU支持的所有DTC列表及其状态)(必须支持)。这个就不必发DTC状态掩码了。所有支持的DTC列表及其状态都会打印出来。
在这里插入图片描述
来源于网上摘抄。
⑨、$34 Request Download(请求下载)

⑩、$36 Transfer Data(数据传输)

⑪、$37 Request Transfer Exit(请求退出传输)

<think>好的,用户想了解UDS诊断协议的学习路径,从入门到精通。首先,我需要整理已有的信息。根据提供的引用内容,Dcm模块支持UDS协议,与PDU路由器等模块集成[^1][^2]。同时,AUTOSAR的架构中DCM位于服务层,处理诊断通信。用户可能已经知道一些基础,但需要系统的学习路径。 首先,应该从基础概念开始,比如什么是UDS,它在汽车电子中的作用,以及相关的标准如ISO 14229-1。这部分需要确保用户理解协议的基本结构和应用场景。接下来,需要结合AUTOSAR架构,因为UDS在其中的实现涉及DCM模块和其他模块的交互,比如CanIf和PduRouter[^1]。这时候可能需要引导用户学习AUTOSAR的分层结构,特别是服务层和通信服务。 然后,用户可能需要实际操作的经验,比如配置工具EB或Davinci,分析源码,这可以参考引用3中的课程内容[^3]。这里需要强调理论与实践结合,通过工具配置和代码分析加深理解。此外,UDS的服务分类,如诊断会话管理、DTC读取等,是核心内容,需要详细讲解每个服务的功能和使用场景。 协议细节部分,比如SID、子功能、数据格式,以及NRC错误码,都是必须掌握的内容。用户可能需要了解如何解析和处理这些数据。通信机制如多帧传输和流控制也是实际应用中常见的,需要结合实际案例来学习。 深入AUTOSAR实现时,DCM模块的工作流程和与其他模块的接口是关键。用户需要知道DCM如何处理请求,与PDU路由器的交互,以及诊断状态管理。这部分可能需要参考引用2中的架构说明。 进阶部分应该包括安全性相关的功能,比如27服务中的加密算法,以及自动化测试的方法。同时,源码分析和调试技巧能帮助用户解决实际问题。最后,持续学习资源如官方文档、社区论坛和实战项目经验是保持更新的重要途径。 用户可能希望了解每一步需要哪些资源,比如推荐的书籍、在线课程或实践工具。需要确保学习路径循序渐进,避免跳跃,同时提供相关参考资料。此外,用户可能对如何应用UDS进行实际车辆诊断感兴趣,因此案例分析和项目实战是必要的。 总结来说,学习路径应该分为基础、AUTOSAR集成、协议细节、深入实现、进阶应用和持续学习六个阶段,每个阶段明确目标、学习内容和推荐资源。同时,生成的相关问题需要覆盖用户可能进一步询问的方向,如工具选择、服务分类、源码分析等。</think>### UDS诊断协议学习路径分步指南 (一)基础理论准备阶段 1. 掌握车载诊断基本概念 - 学习ISO 14229-1标准文档,理解UDS协议架构 - 区分不同诊断协议差异(如KWP2000 vs UDS) - 建立车辆ECU通信模型认知(请求-响应模式) 2. 熟悉AUTOSAR基础架构 - 理解BSW分层结构中DCM模块的定位$$ DCM \subset Service Layer \subset BSW $$ - 掌握PDU Router与CAN/LIN通信的交互关系 - 绘制诊断数据流示意图:应用层→DCM→PDU Router→总线驱动 (二)协议核心要素解析 1. 服务分类学习 - 控制类服务($0x10$会话控制,$0x28$通信控制) - 数据类服务($0x22$读数据,$0x2E$写数据) - 诊断类服务($0x14$清故障码,$0x19$读DTC) 2. 协议格式精讲 - 掌握SID+SubFunction编码规则 - 解析典型请求帧:$3E 00$(保持会话请求) - 理解NRC错误码矩阵(如$0x22$条件不满足) (三)AUTOSAR实现实践 1. DCM模块配置 - 使用Davinci工具配置诊断服务响应表 - 设置P2/P2*超时参数 - 配置诊断ID过滤器(如$0x7E0/0x7E8$) ```c /* 示例诊断响应处理代码 */ void Dcm_ServiceTable_Init() { Dcm_ConfigType cfg = { .SIDTable[UDS_SVC_DIAG_CONTROL] = HandleSessionControl, .SIDTable[UDS_SVC_READ_DATA] = HandleReadDataById }; Dcm_Init(&cfg); } ``` 2. 通信集成调试 - 使用CANoe模拟诊断仪发送$0x22$请求 - 抓取PDU Router转发的诊断报文 - 分析DCM与DEM模块的交互时序[^1] (四)进阶实战提升 1. 安全访问实现 - 学习$0x27$服务的种子-密钥算法 - 实现AES-128加密算法集成 - 配置安全等级跳转条件 2. 扩展诊断功能开发 - 添加自定义DID(如$0xF120$) - 实现多帧传输(FlowControl) - 开发诊断事件触发器 (五)学习资源推荐 1. 核心教材 - 《ISO 14229-1道路车辆统一诊断服务》 - 《AUTOSAR_EXP_DCM.pdf》官方文档 - 《汽车电子诊断技术实战》(机械工业出版社) 2. 工具链配置 - Vector Davinci Configurator - CANoe.DiVa测试模块 - EB tresos Studio
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值