1诊断请求分为两类:一类是带子服务的,一种不带子服务的
诊断服务格式:SID(Service ID)+子服务(sub-function)
诊断响应格式:肯定响应(positive response)和否定响应(negative response)
1.肯定响应
SID+0x40
子服务(sub-function):最高位响应抑制位,剩下7个BIT为子服务
例:10 01--->50 01
2否定响应
7F+SID+否定响应码
例:
10 02--->7F 10 7E(表示10 02请求因为该子服务在当前会话不支持返回0X7E而拒绝)
具体UDS诊断服务
DignosticSessionControl(会话诊断控制 10服务)
SID固定值:0x10
子服务(sub-function)
0X01 defaultSession (默认会话):
进入:通常在ECU断电/上电之后就会停留在默认会话
权限:权限较低,很多诊断服务请求不支持,诊断相关数据无法被读写
0X02 ProgrammingSession (编译会话)
进入:扩展会话下,诊断仪向ECU发送10 02
权限:编译会话的权限很高,支持的诊断服务很多,例如软件刷写相关的一系列服务。
0X03 extendeDiagnosticSession (扩展会话)
进入:默认会话下诊断仪给ECU发送诊断会话10 03
权限:诊断会话权限较高,支持诊断服务较多
注:扩展会话和编程会话统称位费默认会话,如果要让ECU保持在非默认会话中,诊断仪需要定时向ECU发送诊断请求0X3E(诊断在线服务),保持诊断仪与ECU之间的通信,使ECU一直处于非默认会话。
0X04 safetySystemDiagnosticSession (系统安全诊断会话)
0X05 - 0x3F ISOSAEReserved (保留)
0X40 - 0x5F vehicleManufacturerSpecific(由整车厂自定义使用)
0x60-0x7E systemSupplierSpecific(由ECU供应商自定义使用)
0x7F ISOSAEReserved(保留)
诊断会话控制响应分为3部分
Response SID:SID+0x40
sub-function:进入的诊断会话
Parameter:固定位4个字节,前两个字节表示P2Server_max:诊断仪发出请求ECU响应的响应时间,后两个字节为P2*Server_max:ECU无法在P2时间内对诊断仪请求做出响应,会响应一帧NRC(否定响应码)0x78,诊断仪收到0x78否定响应码会等待更长的响应时间,也就是P2*Serber_max表示响应NRC78后,对诊断仪请求的最长响应时间。
比如在请求诊断会话服务中,10服务的肯定响应格式是类似50 01 xx xx yy yy, xx xx就表示P2Server_max,yy yy 就表示P2*Server_max。诊断仪收到这两个参数之后,根据这两个参数来判断ECU的响应是否及时。
诊断会话控制对应的否定响应码:
| NRC | 描述 |
| 12 | 子功能不支持 如果请求报文中的子功能参数不支持,要求ECU返回此NRC |
| 13 | 报文长度错误或格式非法 如果请求报文的长度无效,ECU返回此NRC |
| 22 | 条件未满足 ECU不满足切换会话模式的条件ECU返回此NRC |
| 7E | 服务子功能在此当前模式会话下不支持 当前子服务在当前模式下不支持 |
ECUReset(ECU复位11服务)
SID:固定1个字节,0x11
sub-function:最高位为抑制响应位,低7bit表示ECU将模拟那种方式进行复位。
0x01:hardReset:此值定义了模拟断开供电电源后(eg:电池)后重新上电/启动序列的“硬件复位”的情况。此执行动作需具体规定,并没有标准规定。其结果可能导致重新初始化 易失性存储(RAM)和非易失性存储(ROM)至预定义的值。
0x02 keyOffOnReset 钥匙开关复位,此值定义了类似驾驶员关闭又开启点火钥匙的情况。此复位情况要求模拟一个“KEY-OFF-ON”序列(例如,干扰供电电源的转换)。此执行动作执行需要具体规定,并没有标准规定。通常非易失性存储位置收到保护而易失性存储被初始化。
0x03 软复位该类型的复位强迫ECU重启其应用程序,并且在非易失性存储器中存储所有在应用程序重启时可能会丢失的数据。该复位操作应导致应用程序的重启,但不对之前学习的配置参数、自适应系数以及其他长时调整参数等数据重新初始化。
当诊断仪通过诊断请求对ECU进行某些操作,修改了ECU某些数据,只有ECU复位这些操作才能生效,此时需要发送复位请求。在ECUReset执行之后,ECU复位请求的肯定响应报文在复位操作执行之前发送,复位之后,ECU应首先进入默认会话,ECU也从非默认会话进入默认会话。复位请求ECUReset对应否定响应码:
| NRC | 描述 |
| 12 | 子功能不满足 |
| 13 | 报文长度错误或格式非法(长度无效) |
| 22 | 条件不满足(不满足复位条件) |
| 33 | 安全访问拒绝(在请求当前请求复位受保护的状态下) |
| 7F | 服务在当前会话模式下不支持 |
SecuityAccess(0x27 27服务)
安全访问 一般使用种子和密钥来实现,步骤如下:
1.诊断仪向ECU请求“Seed”
2.ECU向诊断仪做出肯定响应发送“Seed”(Seed通常是生成的随机数)
3诊断仪向ECU发送“Key”(Key根据ECU响应的Seed计算得来)
4ECU判断诊断仪发送过来的Key是否有效,做出肯定响应和否定响应
安全访问请求Seed的否定响应码包括:
| NRC | 描述 |
| 12 | 子功能不满足 |
| 13 | 报文长度错误或格式非法(长度无效) |
| 22 | 条件不满足 |
| 37 | 延迟时间未到(在 27 服务安全访问流程中,当客户端(诊断仪)发送了错误的密钥(sendKey 失败)后,ECU 会进入一个锁定 / 冷却期。如果在冷却期结束前客户端再次发起安全访问请求(无论是 requestSeed 还是 sendKey),ECU 就会回复 NRC 0x37。) |
| 7F | 服务在当前会话模式下不支持 |
安全访问发送Key的否定码
| NRC | 描述 |
| 12 | 子功能不满足 |
| 13 | 报文长度错误或格式非法(长度无效) |
| 22 | 条件不满足 |
| 24 | 请求序列错误 如果在接收到seedkey子功能前没有接收到requestseed请求报文,返回此NRC |
| 35 | 密钥无效 |
| 36 | 超出密钥访问次数限制(延迟定时器超过最大允许失败尝试次数激活) |
| 7F | 服务在当前会话模式下不满足 |
通信控制请求 (0x28 28服务)
通信控制服务请求与响应格式
请求:SID+sub-function+CommunicationType(通信类型)+nodeIdentification Number
响应:SID+sub-function
SID:0x28
sub-function:
0x00 enableRxAndTx(激活接受和发送)此值说明对于指定的通信类型须允许接受和发送报文。
0x01 enableRxAndDisableTx(激活接收和关闭发送)此值说明对于指定的通信类型须允许接收报文但禁止发送报文。
0x02 disableRxAndEnableTx(激活发送和禁止接收)此值说明对于指定的通信类型须允许发送报文但禁止接收报文。
0x03 disableRxAndTx(禁止发送和接收)此值说明对于指定的通信类型须禁止接收和发送报文。
CommunicationType(通信类型)
CommunicationType:固定为1个字节,表示对ECU的哪种报文进行控制。用来定义控制通信的类别。CommunicationType是一个位代码(bit-code)值,允许同一时刻控制多种通信类型,最常用的就是低2位:
0x1代表普通应用报文,此值定义的所有的应用相关通信。(内部应用信号在整车多服务器间交换)。
0x2代表网络管理报文,此值定义了所有网络管理相关通信。
0x3代表普通应用报文和网络管理报文,此值定义了所有网络管理相关和应用相关通信。
nodeIdentificatioNumber :是optional可选的,只有当sub-function等于0x04或0x05时才需要使用。
否定响应码
| NRC | 描述 |
| 12 | 子功能不支持 |
| 13 | 报文长度错误或格式非法(长度无效) |
| 22 | 条件不满足 |
| 31 | 请求超出范围(通信类型参数检测错误) |
| 7F | 服务在当前会话模式下不支持 |
TesterPresent (0x3E 3E服务)
设备在线,防止ECU从非默认会话中复位
SID+sub-function
当sub-function是0x00时,ECU要给出response;当sub-function是0x80时,ECU不需要给出response。(抑制位是否置1)
否定响应码:
| NRC | 描述 |
| 12 | 子功能不支持 |
| 13 | 长度无效 |
ControlDTCSetting(0x85 85服务)
此服务用于启动或者禁止ECU中诊断故障码(DTC)设置,防止在ECU执行特殊服务时,其他节点记录DTC.
请求:SID+sub-function+OptionRecrd
响应SID+sun-function
sub-function: 固定为1个字节,最高位表示肯定响应抑制位,低7位表示打开还是关闭ECU的DTC存储,UDS通过低7位定义了两种DTCSettingType:0x01 表示打开,0x02表示关闭。
OptionRecord:是可选择optional的,由厂家自定义,eg 可以用FF FF FF来表示这条诊断服务针对所有的DTC。
否定响应码:
| NRC | 描述 |
| 12 | 子功能不满足 |
| 13 | 长度无效 |
| 22 | 条件不满足 |
| 31 | 请求输出超出范围 |
| 7F | 当前会话模式不满足 |
ReadDataByIdentifier (0x22 22服务)
SID+DID
例:
03 22 F1 87
03 22 F1 95
否定响应码:
| NRC | 描述 |
| 13 | 长度无效 |
| 22 | 条件不满足 |
| 31 | 请求超出范围 |
| 33 | 安全访问拒绝 |
2E 服务通常要求先通过 27 服务安全访问(解锁扩展会话或编程会话),否则会被拒绝。常见 NRC:
RoutineControl(0x31 31服务)
对 ECU 上的例程(Routine)进行启动、停止或查询结果,常用于执行一段需要时间的操作流程,比如擦除 Flash、校验编程依赖、执行特定功能例程等。
请求格式:SID+subfunction+routineIdentifier+OptionRecord
响应格式:SID+subfunction+routineIdentifier+routineControlOptionRecord
例:
31 01 02 03--->31 01 02 03
否定响应码
大量数据传输服务(34、35、36、37服务)
RequestDownload(0x34):客户端向服务器请求下载数据。
RequestUpload(0x35):客户端向服务请求上传数据。
TransferData(0x36):客户端向服务器传输数据。
RequestTransferExit(0x37):数据传输完成,请求退出数据传输。
34服务:
格式:SID+dataFormIDentifier(占1个字节,数据格式相关信息)+addressAndLengthFormatIDentifier(占一个字节,高4bit标识memorySize所占的字节长度,低4个bit标识memoryAddress所占的字节长度)+memoryAddress(写入数据在ECU中的地址)+memoruSize(写入数据的字节数)
肯定响应:
ECU 通过这个值告诉诊断仪:每次 36 传输最多发多少字节,诊断仪据此分块。
例:
常见NRC
36服务
常见NRC:
36 服务在诊断框架中的典型处理逻辑:
- 校验块序号— 与内部期望的计数器比对,不一致则回 0x24
- 校验数据长度— 不超过
maxNumberOfBlockLength,且累计不超过 34 声明的总长度 - 写入 Flash/NVM— 调用底层 Flash 驱动按地址偏移写入
- 更新地址偏移和剩余长度— 为下一块做准备
- 超时监控— 两块之间如果超时未收到下一个 36,应终止传输并清理状态
37服务
客户端使用37服务终止客户端与服务器的数据传输。37服务标识退出数据传输,如果ECU对34和36服务进行了肯定响应,ECU也会对37服务进行肯定响应。37服务的请求只有一个字节37,肯定响应也只有一个字节77。如果前面的36服务没有执行完成,比如出现丢帧或者数据没有传完,此时发37服务,ECU会做出否定响应NRC 0x7F 37 24。