本文主要是介绍《UDS协议从入门到精通》系列——图解0x87:链路控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《UDS协议从入门到精通》系列——图解0x87:链路控制
- 一、简介
- 1.1 该服务的功能及用法
- 1.2 该服务的应用场景
- 二、数据包格式
- 2.1 服务请求格式
- 2.2 服务响应格式
- 2.2.1 肯定响应
- 2.2.2 否定响应
- 三、通信示例
Tip📌:本文描述中但凡涉及到其他UDS服务的,将陆续提供链接跳转方式以便快速了解他们。(各服务介绍持续更新中…)
>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<
一、简介
1.1 该服务的功能及用法
该服务主要用于改变诊断仪(客户端)和目标ECU(服务器)之间的通信速率(数据传输波特率),准确地说是客户端应该在非默认会话状态下发送请求控制通信的波特率,当发生会话转换切回默认会话状态或ECU复位时,通信速率要恢复默认状态。但从当前非默认会话过渡到另一个非默认会话不会影响波特率。
协议标准将这个通信速率转换流程分成两步,主要目的是为了解决功能寻址下的通信存在的问题(因为功能寻址通信状态下请求以广播的方式发送出去,将同时在多个服务器中进行波特率转换):
- 第一步:客户端先发送请求询问目标ECU能否支持指定的波特率的转换,如果是功能寻址发送的请求,则在客户端执行第二步之前,要求每个目标ECU都应作出肯定响应(不会抑制肯定响应,spr=0),但此步骤实际上不执行波特率转换。
- 第二步:客户端发送请求请求目标ECU进行通信速率转换(在第一步得到支持转换的前提下,才会执行这一步)。如果是功能寻址的模式下,建议在执行转换过程中任何目标ECU都不要发送肯定响应(因为假设某个目标ECU完成了波特率转换,其他的才发送肯定响应,那么将导致双方波特率不匹配使得总线上出现错误帧)。
简单来说,该服务的执行过程就是:在改变传输速率前,先询问目标ECU是否支持某种通信方式,得到支持的响应后,再发请求执行通信速率的变更(总共发送两次请求)。
1.2 该服务的应用场景
最常见的应用场景就是在ECU刷写程序时临时提高传输速率,刷写完毕后再恢复正常,以提高刷写速度。这个服务在之前车上CAN总线通信速率较低的时候有应用场景,现在应用比较少是因为车上的CAN总线速率普遍比较高了,能到500K,刷写程序也够用,所以就不需要改变通信速率了。而且运行过程中改变通信速率很容易出现错误帧。
Tip📌:该服务只适用于部分底层传输协议,例如CAN、Flexray等速率可变的通信方式。
二、数据包格式
2.1 服务请求格式
linkControlType(1Byte):表示链路控制的类型,具体有以下几种:
取值 | 含义 |
---|---|
0x00 | ISO保留; |
0x01 | verifyModeTransitionWithFixedParameter: 验证是否可以执行带有指定参数的转换,指定的参数在linkControlModeIdentifier中, 这时这个参数的值是一些预定义的波特率,详情见下个参数中的解释 |
0x02 | verifyModeTransitionWithSpecificParameter: 验证是否可以执行带有指定参数的转换,指定的参数在linkControlModeIdentifier中, 这时这个参数的值是一些特定定义的波特率(可简单理解为自定义),详情见下个参数中的解释 |
0x03 | transitionMode:表示将波特率转换为前面的验证消息中指定的波特率,即简介中该服务流程第二步时候的请求值 |
0x04 - 0x3F | ISO保留 |
0x40 - 0x5F | 整车厂商自定义 |
0x60 - 0x7E | 系统供应商自定义 |
0x7F | ISO保留 |
linkControlModeIdentifier(1Byte):在linkControlType为0x01或者0x02时,会携带这个参数,当linkControlType为0x01时,该参数为baudrateIdentifier,是一些预定义的波特率,如下表所示:
取值 | 含义 |
---|---|
0x00 | ISO保留; |
0x01 | PC9600Baud:指定标准PC的波特率为9.6 KBaud |
0x02 | PC19200Baud:指定标准PC的波特率为19.2 KBaud |
0x03 | PC38400Baud:指定标准PC的波特率为38.4 KBaud |
0x04 | PC57600Baud:指定标准PC的波特率为57.6 KBaud |
0x05 | PC115200Baud:指定标准PC的波特率为115.2 KBaud |
0x06 - 0x0F | ISO保留 |
0x10 | CAN125000Baud:指定标准CAN的波特率为125 KBaud |
0x11 | CAN250000Baud:指定标准CAN的波特率为250 KBaud |
0x12 | CAN500000Baud:指定标准CAN的波特率为500 KBaud |
0x13 | CAN1000000Baud:指定标准CAN的波特率为1000 KBaud |
0x14 - 0xFF | ISO保留 |
Tip📌:当linkControlType为0x02时,该参数为linkBaudrateRecord,是特定定义的波特率。
2.2 服务响应格式
2.2.1 肯定响应
linkControlType的取值与请求中的linkControlType值保持一致即可;
2.2.2 否定响应
可能出现的NRC及其含义如下:
NRC | 含义 |
---|---|
0x12 | 子功能参数不受支持 |
0x13 | 消息长度错误 |
0x22 | 请求顺序错误,比如没有询问是否支持请求的通信速率转换就直接发送通信速率转换请求 |
0x24 | 不满足请求标准/条件(比如请求复位操作时,ECU判断当前车速不满足复位条件) |
0x31 | 请求中携带的数据是无效的,这里特指设定的波特率是无效值 |
三、通信示例
举两个例子,一是诊断仪请求将通信速率设置为预定义的标准波特率PC115200Baud,二是诊断仪请求将通信速率设置为自定义的波特率150k Bits/s,通信数据传输情况如下所示:
>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<
这篇关于《UDS协议从入门到精通》系列——图解0x87:链路控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!