Uds on Can & ISO 15765-2

本文介绍了UDS(统一诊断服务)协议,它是汽车行业中一种通用的诊断协议,类似于HTTP协议。UDS通过应用层的请求和响应机制,支持不同网络间的诊断功能。文章详细解释了UDS在网络层(TP层)的实现,包括ISO15765-2中的数据帧类型、多包传输策略以及诊断寻址方法,涉及物理寻址和功能寻址的概念。

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

简介

UDS (Unified Diagnostic Services,统一的诊断服务)诊断协议是ISO 15765和ISO 14229定义的一种汽车通用诊断协议,位于OSI模型中的应用层,它可在不同的汽车总线(例如CAN, LINFlexray, Internet)上实现。UDS协议的应用层定义是ISO 14229-1,目前大部分汽车厂商均采用UDS on CAN的诊断协议。

协议的目的是建立统一的诊断服务:多种网络,统—诊断

可类比同样处于应用层的http协议,UDS的本质是一系列的服务,通过「请求」和「响应」的形式,对ECU进行测试、检测、诊断等功能。UDS诊断位于应用层,意味着只用关注数据场的部分,而提供差错控制等功能的部分不用关注。

UDS网络层/TP层(ISO 15765-2)的解读

网络层概述

UDS网络层,又称为TP层(Transport Protocol Layer),本文默认描述的是uds on can。其存在的主要目的是为了解决ISO 11898协议中定义的经典CAN数据链路层与ISO 14229协议中定义的应用层,彼此之间数据长度不统一的问题。说的专业一点,主要解决数据链路层和应用层之间的数据长度不统一的问题。如何科学、快捷、安全地将多个字节通过经典CAN来进行传输,就成了一个需要解决的问题。ISO 15765-2 协议由此诞生。

15765-2作为车辆诊断通信的一个组成部分,规范了“传输协议和网络层服务”。

所有的网络层服务都具有相同的通用结构。为了定义这种服务、需要定义三种类型的服务原语

A. 请求服务(Request):用于向网络层传递控制报文信息及要发送的数据,应用于更高层或应用层。如tester向ECU发出数据。

B. 指示服务(Indication):用于向更高层或应用层传递状态信息及接收到的数据,应用于网络层。如ECU收到了tester的数据,传至应用层。

具体说来,Indication前端应该执行的是底层传入数据的处理函数,即读取PDU信息,这一帧具体是SF、FC、CF还是FF。若满足条件,继续向上,即应用层传递。

C. 确认服务(Confirm):被网络层使用,用于向更高层或应用层传递状态信息。如tester收到了ECU方面的数据。

。。。。。这段话,我也没怎么看懂。我的理解是API,Autosr 中的xxx_Rxindicaiton 、xxx_TxIndication、这种应该也是借检了这种思想。

多包传输

再次重申需要解决的主要问题,由于数据帧比较短,CAN数据帧传输8字节,即使CAM FD也仅仅传输64字节,如果一条诊断命令的长度超过数据长度,就需要分包传输,即多帧传输,当然还有流量控制等。

如此就引出了第一个问题的解决方案——四种数据帧

根据ISO 15765规范规定了帧格式:

SF = SingleFrame FF = FirstFrame CF = ConsecutiveFrame FC = FlowControl DL = Data lenth Control

无论单帧还是多帧,每一帧的0号字节的高4位用于区别帧类型(0/1/2/3)

单帧发送

(1)单帧意味着这一帧的数据场部分有效字节数<=8,不足的地方多以0xAA/55/CC等填充(增加跳变);

(2) 对于单帧,0号字节的低4位[SF_DL] 表示DLC,表示的是要读后面多少个数据,表示的是后面有效数据的长度。

eg:

02 10 03 55 55 55 55 55 --->有效数据是 10 03 55 55 55 55 这部分都是填充位,

01 10 03 55 55 55 55 55 --->有效数据是 10

多帧发送

多帧的发送逻辑

首帧--FF

0号字节高4位固定位1,低4位加上1号字节组成DLC,表示多帧传输的数据长度(如果是22/2E读写数据,要包含SID+DID)

流控帧--FC

FC中携带了一些控制信息,发送方按照FC中的控制信息发送。

第零个字节高4位固定为3,低四位表示流状态参数FS

FS:0,CTS表示继续发送;(流量控制)

1,WT表示等待,令发送方停发,直到下一个流控帧到来;

2,OVFLW表示溢出,当接收方接收到首帧,判断FF_DL的长度比缓冲区大时,接收方就会发送。发送方收到后,知道了溢出,就会停止发送。

3-F,保留

1号字节表示BS块大小,即接下来会发送几帧连续帧。当BS=0时,块大小不做限制;

2号字节表示STmin,规定了连续帧发送的最小时间间隔。

连续帧--CF

0号字节高4位固定为2,低4位表示包的连续号SN,后面跟着数据

eg:

诊断寻址

我们的汽车上有许多的ECU ,当上位机连接诊断口,需要对摸个特定的ECU进行诊断的时候我们是不是应该规定一个地址来表示当前ECU,ECU收到响应发送数据的时候也需要向上位机表明是当前的ECU发出的响应。在UDS ON CAN中,我们自然的就把CAN ID 作为这个地址。

有时候我们需要对多个ECU进行诊断,难道我们需要反复发送相同的诊断请求给到不同的ECU吗?

这就提出了物理寻址和功能寻址的两个概念,一般功能寻址ID 是0x7DF。

本文只是简单的描述了ISO15765-2,细节还需要看标准原文。后面会更新autosar 中UDS 协议的框架和实现

本文许多的截图和文字描述都来自下面视频,如有介意联系删除

车载测试之UDS诊断协议5:请求和响应的寻址_哔哩哔哩_bilibili

【车载网络学习02】UDS诊断(一)_哔哩哔哩_bilibili

### UDS诊断协议在网络层的实现与应用 UDS(Unified Diagnostic Services,统一诊断服务)是一种广泛应用于汽车系统的设备维护协议。它遵循多个国际标准,其中涉及网络层的主要包括 ISO-15765ISO-14229 协议[^1]。 #### 1. 网络层的核心规范 ISO-15765 是专门针对网络层设计的标准,主要用于规定传输协议和服务机制。此协议定义了如何在 CAN 总线上进行消息传递以及数据分段处理的方式。具体来说: - **TP(Transport Protocol,传输协议)** 负责将较大的 PDU 数据拆分为较小的数据帧以便于发送,并在接收端重新组装这些数据帧。 - 它支持单帧模式和多帧模式两种通信形式,在多帧模式下需要额外的流量控制管理来协调数据流的速度。 #### 2. 数据封装过程 在一个典型的 UDS 请求中,PDU 的结构可以分解如下: \[ \text{A_PDU} = \text{A_PCI} + \text{A_Data} \] 这里 A_PCI 表示协议控制信息部分,而 A_Data 则包含了实际要传送的有效载荷数据[^3]。 当涉及到较大尺寸的消息时,由于物理总线带宽限制,通常采用 TP 进行分割操作后再逐片发出。这种技术确保即使超出单一报文长度上限也能顺利完成整个事务流程。 #### 3. 常见问题及其解决方案 尽管基于 ISO-15765 的实现提供了强大的基础框架,但在实践中仍可能出现一些挑战: ##### (a) 流量拥塞 如果 ECU 同时接收到过多请求,则可能导致缓冲区溢出从而引发丢包现象。为此引入 FC(Flow Control Frame),即流量控制帧用于调节上游节点发包速率以匹配下游能力。 ##### (b) 错误检测与恢复 为了增强可靠性,每当发生异常情况比如超时未响应或是非法参数等问题时,服务器应回复相应的 NRC (Negative Response Code)。这有助于客户端快速定位并修正潜在缺陷。 以下是利用 Python 编写的简单模拟程序片段展示如何构建基本的 UDS 查询命令序列: ```python import can def send_uds_request(bus, arbitration_id, service_id, data=[]): message = [ service_id, *data ] try: msg = can.Message(arbitration_id=arbitration_id, data=message, is_extended_id=False) bus.send(msg) print(f&quot;Message sent on {bus.channel_info}&quot;) except Exception as e: print(e) if __name__ == &quot;__main__&quot;: with can.interface.Bus(bustype=&#39;socketcan&#39;, channel=&#39;vcan0&#39;) as bus: # Example of sending a diagnostic session control request. send_uds_request(bus, 0x7DF, 0x10, [0x01]) ``` 上述代码展示了通过 SocketCAN 接口向虚拟 CAN 设备 vcan0 发送一条启动默认会话类型的指令实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值