UDS诊断协议

UDS

  • 主要功能:读取故障,数据传输,上传下载,复位等

借鉴参考了shnsxz大佬的博客
借鉴参考了fish_study_csdn大佬的博客
借鉴参考了小猫爪大佬的博客

在这里插入图片描述

诊断请求15765
第一字节
  • 为了解决数据过长,即分包的问题,15765-2总共定义了4种类型的帧结构在这里插入图片描述

  • 表示四种帧的类型主要靠byte1的高四位,单帧为0,首帧为1,连续为2,流控为3

在这里插入图片描述

  • 在单帧的情况下(即),SF_DL代表后面有几个字节数据,如果有没有使用的字节,通常要用0x55或0xAA来填充。

在这里插入图片描述

  • 分包情况的工作流程,如下图所示

在这里插入图片描述

  • 首先,发送端通过FF(FirstFrame)启动通信,其中前两个字节的高位4bit标识为0001代表FF,低4bit与第二个字节共同表示总数据长度,这个数据长度也包含回复FF的数据,不包含连续帧的第一字节。接着,接收端回应FC(FlowControl),首字节高4bit为0011,低4bit的FlowStatus和第二个字节的BlockSize、第三个字节的SeperateTime共同指示接收速率。FlowStatus存在三种状态:CTS(0)、WT(1)、OVFLW(2)。

    • FlowStatus的状态:FlowStatus为0时,允许发送ConsecutiveFrame;为1时要求暂停发送,恢复时再发FlowStatus=0通知;若因资源限制无法接收数据,则发送FlowStatus=2的FlowControl。

    在这里插入图片描述

    • Stmin的状态:由控制图可知,Stmin的大小控制的是上一帧CF结束到开始下一帧CF中间的最小时间间隔
      在这里插入图片描述

    • BS的状态:BS的大小是CF帧在没有流控帧的情况下能发多少帧,例如BS为5,那么CF能够发五帧,然后就要看新的流控帧如何调配。

    在这里插入图片描述

  • CF就是承载FF无法完全承载的剩余数据了,它第一个字节的高4位为0010,低4bit用于标识CF的序列号,序列号从1开始,每发送一次CF增加1。

    • 当总数据达到FF中的数据长度后停止发送
  • 分段传输的诊断服务举例:
        这是一个读取DTC的命令和应答。
        03 19 02 08 55 55 55 55 (诊断仪发送的SingleFrame的request)
        10 33 59 02 19 01 00 07 (ECU以FirstFrame开始传输的response)
        30 00 00 55 55 55 55 55 (诊断仪发送的FC)
        21 09 03 05 02 09 05 04 (ECU发送的CF)
        22 07 09 05 06 06 09 05 (ECU发送的CF)
        23 08 03 08 07 01 05 08 (ECU发送的CF)
        24 07 01 06 08 07 01 0C (ECU发送的CF)
        25 08 07 01 0D 08 07 03 (ECU发送的CF)
        26 07 09 08 01 01 09 09 (ECU发送的CF)
        27 01 07 09 AA AA AA AA (ECU发送的CF,此时传输结束)
        BS和STmin等于0时,表示接收端可以以最快的速度来接收数据,发送端可以一次发送的CF数量不受限制。

其余字节14229
UDS报文
  • 有子功能

    • 1byte:Service ID(SID),服务标识符,相当于CCP的CMD,代表了这条诊断命令执行的什么功能。

    • 1byte:Sub-function,当前服务标识符具体的操作,代表当前诊断服务的具体操作

      • 其中Sub-function的8个bit,最高位的1bit用于抑制正响应。当最高位为1时,不会给出正响应;为0,给出正响应。
    • xbyte:Parameter,当前功能下的发送参数

    • 例如:31 01 08 09为开启软件刷写检查,31 02 08 09为关闭

      • 31为服务标识符,01为子功能ID,08 09为具体参数
  • 没有子功能

    • 1byte:Service ID,服务标识符

    • xbyte:Parameter,当前功能下的发送参数

通用介绍
  • 正响应的意思是执行成功后,服务端返回报文报告执行成功
  • 负响应的意思是执行失败后,服务端返回报文报告执行失败
  • 负响应返回的报文:最高字节固定为7F,第二字节为被拒绝的SID,后续字节为被拒绝的原因

    • 发送报文:27 05

    • 回复:7F 27 13

    • 在这里插入图片描述

  • 正响应返回的报文:最高字节为SID基础上加上0x40,剩余为发送数据,与后续返回的数据,如果没有子功能

    • 发送报文:27 05

    • 回复:67 05 xx xx xx

  • 诊断会话包含三个子功能:01 Default默认会话,02 Programming编程会话,03 Extended扩展会话,

    • ECU上电后,一般处于默认状态

    • 编程会话:可以进行软件刷写等一系列操作

    • 扩展会话:大部分诊断数据读写
      在这里插入图片描述

  • 如图为UDS诊断协议图片,进入01会话成功,进入02会话失败,进入03会话成功

    4d54610593226da49c05eccba830dfa4

物理寻址和功能寻址
  • 物理寻址指的是请求端与单个响应端之间的通信,而功能寻址是请求段与多个响应端之间的通信。即请求端通过物理寻址方式发送请求时,只能有一个ECU可以回复响应;如果通过功能寻址方式发送请求时,同一网络中支持该功能寻址的所有ECU都需要回复响应。
  • ECU设备有自己的物理地址和反馈地址。该地址会在项目初期就确定好。诊断仪向ECU A物理寻址,则ECU A在自己的反馈地址发送数据给诊断。诊断仪功能寻址,则ECU A\B\C都会在各自的反馈地址发送数据给诊断。
常见的SID诊断服务
  • 10服务:诊断会话,10 01默认会话;10 02编程会话;10 03扩展会话;

  • 11服务:该服务请求ECU根据复位的内容有效地执行ECU复位,11 01硬件复位;11 03软件复位

  • 14服务:使用此服务来清楚ECU内存中的故障内存的诊断行行行;常见的请求命令为14FFFFFF

  • 19服务:此服务读取ECU驻留诊断故障代码(DTC)信息的状态;常见用法是19 02 09读取当前和历史故障

  • 22服务:该服务允许通过DID向ECU请求读取数据值;读取功能配置22 F1 01;网络配置22 F1 10等

  • 27服务:该服务在向ECU请求写入数据时需要进行的解锁服务;请求种子2701;发送钥匙2702

  • 28服务:用于“打开/关闭”ECU的某些消息的传输和/或接收,以及消息的通讯类型,常见的有28 01 只收不发

  • 2E服务:该服务 允许通过DID在解锁条件下向ECU请求写入数据值;常见的为写入车辆的网络配2E F1 10 xx

  • 2F服务:使用此服务来替换输入信号、内部ECU功能和\或控制由服务器的数据接口引用的电子系统的输出(执行器)

  • 31服务:客户端使用此服务来启动/停止例程,并在服务器的内存中请求例程结果。通常刷写过程中会用到。

参考小趴菜_自动驾驶搬砖人大佬

在这里插入图片描述

  • 其中22和2E读取和写入参数,是依据DID,DID的功能值需要公司内部进行定义,例如77 62,我定义的是读取硬件版本
  • 22服务的例子:
// 0x23为诊断仪,0x24为下位机

//03代表单帧,有效值为三个字节
// 22代表读取DID参数
// 77 62为DID值,在我的工程里命令为为读取硬件版本
0x23      03 22 77 62 00 00 00 00 

// 10中的1代表为连续帧的首帧,013代表总数据长度,即19个字节
// 62 77 62为回复DID命令,剩余字节为数据帧
// 数据对应ASCII码,34 31 33数据对应'4' '1' '3'
0x24      10 13 62 77 62 34 31 33 

// 流控帧,告诉下位机用什么速率发剩余报文
// 30中的3代表流控帧,0代表FS中的继续发送状态
// 第一个00代表BS,在没有流控帧的情况下能发多少帧,第二个00代表stmin,两帧发送的时间间隔
// 即告诉下位机全速发送
0x23      30 00 00 00 00 00 00 00 

// 21中的2代表连续帧,1代表是第一个连续帧,后面的是数据
0x24      21 30 30 31 36 32 38 35 

// 21中的2代表连续帧,2代表是第二个连续帧,后面的是数据
// 6+7+6 = 19,所以的00不是数据
0x24      22 30 30 2e 31 30 30 00 
  • 2E服务的例子:
// 02表示单帧,有效两个字节。10 03表示切换到扩展诊断
0x23     02 10 03 00 00 00 00 00
// 06表示单帧,有效字节为6个。50 03是固定的
// 前两个字节代表P2Server_max:ECU在接收到请求消息后,需要在50ms时间内发出响应消息的性能要求。后两个字节代表P2EServer_max:当ECU发送否定响应码为0x78后,到ECU再次发出响应消息最长5s时间。
0x24     06 50 03 00 32 13 88 00 
// 02同理,27 01代表请求获取密钥种子
0x23     02 27 01 00 00 00 00 00 
// 06 67 01同理,剩余的四个字节是种子值
0x24     06 67 01 66 75 3a 25 78 
// 06同理,27 02代表发送密钥值,剩余的四个字节密钥值
// 密钥算法两方确定好,上位机接收下位机种子,进行运算后发送给下位机,估计CCP协议应该和这个差不多
// 下位机与自己运算获得的密钥对比进行解锁
0x23     06 27 02 58 34 31 2c 00 
// key正确,发送正响应,负响应的话35代表key错误
0x24     02 67 02 00 00 00 00 00 

// 10代表连续首帧,14代表有20字节,2e写入DID指定数据
// 2c 90代表软件版本
0x23     10 14 2e 2c 90 35 32 31 
// 流控帧,全速发送
0x24     30 00 00 00 00 00 00 00 
// 连续帧
0x23     21 34 35 36 35 34 35 33 
0x23     22 36 34 38 35 31 32 33 
// 传输完成,给出正响应
0x24     03 6e 2c 90 00 00 00 00 
  • 代码刷写部分的例子

借鉴参考了车小猿大佬的UDS(十)应用层 34/36/37博客

// 0x23为下位机反馈诊断仪ID,0x24为下位机物理寻址,0x22为功能寻址

// 10 03表示切换到扩展诊断
0.000000 1 0x22 Rx d 8 02 10 03 00 00 00 00 00 
0.003100 1 0x24 Rx d 8 06 50 03 00 32 13 88 00 

// 85 02,85代表设置故障诊断(DTC),02代表禁用诊断故障码
0.007300 1 0x22 Rx d 8 02 85 02 00 00 00 00 00 
// 正响应
0.011100 1 0x24 Rx d 8 02 c5 02 00 00 00 00 00 

// 28代表通信控制,03代表禁用消息接收
0.015300 1 0x22 Rx d 8 03 28 03 03 00 00 00 00 
// 正响应
0.020900 1 0x24 Rx d 8 02 68 03 00 00 00 00 00 

// 10 02切换到刷写服务
0.166100 1 0x23 Rx d 8 02 10 02 00 00 00 00 00 
0.169100 1 0x24 Rx d 8 06 50 02 00 32 13 88 00

// 27 01请求seed
0.274700 1 0x23 Rx d 8 02 27 01 00 00 00 00 00 
// 正响应,返回seed
0.280100 1 0x24 Rx d 8 06 67 01 23 55 45 10 00 
// 27 02发送key
0.386800 1 0x23 Rx d 8 06 27 02 32 22 14 02 00 
// 正响应
0.390200 1 0x24 Rx d 8 02 67 02 00 00 00 00 00 

// 31代表请求服务器例程,01代表启动,ff 00代表启用擦除内存的 RID
0.394400 1 0x23 Rx d 8 04 31 01 ff 00 00 00 00 
// 7f代表负响应,31代表请求服务器例程,78表示相应挂起
0.402100 1 0x24 Rx d 8 03 7f 31 78 00 00 00 00 
// 71代表31服务的正响应,RID执行完毕
1.130000 1 0x24 Rx d 8 05 71 01 ff 00 00 00 00 

// 10 0b代表首帧,11个字节,34代表请求下载,00为数据格式化识别码,00代表不使用
// 44代表地址和地址长度,高四位代表内存长度的字节数,低四位代表地址长度字节数
// 即00 00 00 00为内存地址,00 01 84 02为内存长度,99330,
// 即数据文件byte长度,真实长度为99328,最后两个字节为CRC
1.139500 1 0x23 Rx d 8 10 0b 34 00 44 00 00 00 
// 流控帧,全速发送
1.140100 1 0x24 Rx d 8 30 00 00 00 00 00 00 00 
1.140700 1 0x23 Rx d 8 21 00 00 01 84 02 00 00 
// 74代表正响应,高4bit为maxNumberOfBlockLength有效字节长度,低4bit保留为0.
// 02 02为maxNumberOfBlockLength,0x0202表示应用层36服务一次最多发送0x202字节数
1.152800 1 0x24 Rx d 8 04 74 20 02 02 00 00 00 

// 1代表首帧,202代表最大字节数,即为返回的maxNumberOfBlockLength
// 36为传输服务,01代表34服务后第一个36服务
1.212800 1 0x23 Rx d 8 12 02 36 01 00 c0 00 20 
// 全速发送
1.213400 1 0x24 Rx d 8 30 00 00 00 00 00 00 00 

// 当连续帧第一字节填满2F后,下一次就会变为20
// 同理36服务,满了ff,会变为00
1.214000 1 0x23 Rx d 8 21 b1 68 01 08 51 67 01 
.....
// 正响应
1.264700 1 0x24 Rx d 8 02 76 01 00 00 00 00 00 

// 第二个36服务
1.325500 1 0x23 Rx d 8 12 02 36 02 b0 06 00 20 
1.326100 1 0x24 Rx d 8 30 00 00 00 00 00 00 00 
1.326700 1 0x23 Rx d 8 21 00 00 00 00 cc 88 02 
.......
1.376700 1 0x24 Rx d 8 02 76 02 00 00 00 00 00 

// 第三个36服务
1.437100 1 0x23 Rx d 8 12 02 36 03 03 03 82 ea 
1.437800 1 0x24 Rx d 8 30 00 00 00 00 00 00 00 
1.438300 1 0x23 Rx d 8 21 00 00 83 ea 01 01 80 
.......
1.218300 1 0x23 Rx d 8 2f 01 08 f9 68 01 08 69 
1.218800 1 0x23 Rx d 8 20 67 01 08 f9 68 01 08 
.....
1.478000 1 0x23 Rx d 8 29 01 f0 00 45 00 00 00 
1.488200 1 0x24 Rx d 8 02 76 03 00 00 00 00 00 

.................................
// 倒数第二个36服务
22.717300 1 0x23 Rx d 8 12 02 36 c2 00 00 00 00 
22.717900 1 0x24 Rx d 8 30 00 00 00 00 00 00 00 
22.718500 1 0x23 Rx d 8 21 00 00 00 00 00 00 00 
// 正响应
22.770100 1 0x24 Rx d 8 02 76 c2 00 00 00 00 00 

// 最后一个36服务
22.787600 1 0x23 Rx d 8 04 36 c3 47 ed 00 00 00 
22.798900 1 0x24 Rx d 8 02 76 c3 00 00 00 00 00 

// 请求退出上传下载
22.803700 1 0x23 Rx d 8 01 37 00 00 00 00 00 00 
// 正响应
22.807200 1 0x24 Rx d 8 01 77 00 00 00 00 00 00 

// 启动RID例程,02 02为主机厂自定义功能,为checksum
22.812200 1 0x23 Rx d 8 10 08 31 01 02 02 00 93 
// 全速发送
22.813900 1 0x24 Rx d 8 30 00 00 00 00 00 00 00 
22.814500 1 0x23 Rx d 8 21 12 98 00 00 00 00 00 
// 正响应
22.822000 1 0x24 Rx d 8 05 71 01 02 02 00 00 00

// ff 01为检查服务器的内存编程依赖性
22.827500 1 0x23 Rx d 8 04 31 01 ff 01 00 00 00 
23.715200 1 0x24 Rx d 8 05 71 01 ff 01 00 00 00 

// 硬件重启
23.721000 1 0x22 Rx d 8 02 11 01 00 00 00 00 00 
23.721900 1 0x24 Rx d 8 02 51 01 00 00 00 00 00 

// 正常工作
34.689000 1 0x74 Rx d 8 00 00 00 00 e6 00 00 fa 
End Triggerblock	
  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDS(Unified Diagnostic Services)是一种诊断协议,用于在汽车电子控制单元(ECU)之间进行诊断和通信。而CAN(Controller Area Network)是一种常用的实时通信协议,用于在汽车电子系统中进行数据传输。因此,UDS诊断协议与CAN通信协议相结合,形成了UDS诊断协议CANTP。 UDS诊断协议CANTP的作用主要有三个方面。首先,它允许诊断工具与ECU之间进行通信,以获取和更新ECU的诊断信息,例如读取和清除故障码、获取实时数据等。其次,它允许在诊断过程中进行ECU的控制和编程,包括重置ECU、编程ECU等操作。最后,UDS诊断协议CANTP还提供了满足汽车制造商特定需求的自定义功能,使得诊断工具能够适应不同品牌和型号的车辆。 UDS诊断协议CANTP的通信基于CAN总线,利用CAN帧进行数据传输。CANTP协议定义了在CAN总线上的数据传输格式、通信速率等细节,以确保诊断工具与ECU之间的可靠通信。通过CANTP协议诊断工具能够向ECU发送诊断请求,并接收ECU的响应信息。CANTP协议还提供了一些错误检测和纠错机制,以保证诊断过程的稳定和可靠性。 总之,UDS诊断协议CANTP是一种基于CAN通信协议的汽车诊断协议,它通过定义通信格式和细节,实现了诊断工具与ECU之间的可靠通信,具备诊断、控制和编程等功能,旨在满足汽车制造商的特定需求。这一协议在汽车维修和故障排除过程中扮演着重要的角色,提高了诊断效率和准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值