深入理解统一诊断服务(UDS)【下】

参考教程:https://www.bilibili.com/video/BV1aP4y1p7Vo/?spm_id_from=333.1387.favlist.content.click&vd_source=8f8a7bd7765d52551c498d7eaed8acd5

五、诊断服务

1、UDS诊断服务分类

(1)ISO 14229-1中定义的26个服务标识符如下所示,其中蓝底标记的服务较常使用,部分较简单或不常使用的服务将不会详细介绍。

|------|------------------------------------------------|
| SID | 服务 |
| 0x10 | 诊断会话控制(Diagnosis Session Control) |
| 0x11 | ECU复位(ECU Reset) |
| 0x14 | 清除诊断信息(Clear Diagnostic Information) |
| 0x19 | 读故障码(Read DTC Information) |
| 0x22 | 按标识符读取数据(Read DataByIdentifier) |
| 0x23 | 按地址读取内存(Read Memory By Address) |
| 0x24 | 按标识符读取缩放数据(Read Scaling Data ByIdentifier) |
| 0x27 | 安全访问(Security Access) |
| 0x28 | 通信控制(Communication Control) |
| 0x2A | 按周期标识符读取数据(Read Data By Periodic Identifier) |
| 0x2C | 动态定义数据标识符(Dynamically Define Dataldentifier) |
| 0x2E | 按标识符写入数据(Write Data ByIdentifier) |
| 0x2F | 按标识符的输入输出控制(Input Output Control Byldentifier) |
| 0x31 | 例程控制(Routine Control) |
| 0x34 | 请求下载(Request Download) |
| 0x35 | 请求上传(Request Upload) |
| 0x36 | 传输数据(Transfer Data) |
| 0x37 | 请求传输退出(Request Transfer Exit) |
| 0x38 | 请求文件传输(Request File Transfer) |
| 0x3D | 按地址写入内存(Write Memory ByAddress) |
| 0x3E | 测试仪在线(Tester Present) |
| 0x83 | 访问时序参数(Access Timing Parameter) |
| 0x84 | 安全数据传输(Secured Data Transmission) |
| 0x85 | 控制故障码设置(Control DTC Setting) |
| 0x86 | 请求ECU启动或停止对指定事件的响应传输(Response On Event) |
| 0x87 | 通信链路控制(Link Control) |

(2)UDS诊断服务可以分为六大类:

①诊断和通信管理功能单元。

0x10服务------Diagnosis Session Control

0x27服务------Security Access

0x28服务------Communication Control

0x3E服务------Tester Present

0x85服务------Control DTC Setting

0x11服务------ECUReset

0x83服务------AccessTimingParameter

0x84服务------SecureDataTransmission

0x86服务------ResponseOnEvent

0x87服务------LinkControl

②数据传输功能单元。

0x22服务------Read DataByIdentifier

0x23服务------Read Memory By Address

0x24服务------Read Scaling Data ByIdentifier

0x2A服务------Read Data By Periodic Identifier

0x2C服务------Dynamically Define Dataldentifier

0x2E服务------Write Data ByIdentifier

0x3D服务------Write Memory ByAddress

③存储数据传输功能单元。

0x19服务------Read DTC Information

0x14服务------Clear Diagnostic Information

④输入/输出控制功能单元。

0x2F服务------Input Output Control Byldentifier

⑤例程功能单元。

0x31服务------Routine Control

⑥上传/下载功能单元。

0x34服务------Request Download

0x35服务------Request Upload

0x36服务------Transfer Data

0x37服务------Request Transfer Exit

0x38服务------Request File Transfer

2、UDS诊断服务支持的形式

(1)某些UDS诊断服务,除了数据参数以外,A_Data只有SID。

(2)大多数UDS诊断服务支持子功能,A_Data中包含SF。

(3)一些UDS诊断服务支持数据标识符(Data Identifier,DID)。

(4)0x31服务同时包含SID、SF及例程标识符(Routine Identifier,RID)。

3、诊断会话控制(0x10服务)

(1)诊断测试仪和ECU通过通信媒介建立连接,会在会话层形成诊断会话(下图所示为OSI体系结构,是一个七层协议的体系结构)。

(2)诊断会话模式的转换:

一共有三种会话模式------默认会话、编程会话、扩展诊断会话,不同的诊断会话具有不同的功能、不同的定时参数、受到不同的安全访问保护,其转换关系如下图所示

默认会话模式:

通常来说,ECU上电、软件复位(0x11服务)会使会话层进入默认会话模式,也可认为这是个初始化的状态,此时ECU处于锁定状态,执行应用功能程序(APP)

诊断测试仪发送0x10 01服务请求,也会使ECU进入默认会话模式

诊断会话中的定时器S3Sever超时,也会使ECU进入默认会话模式

编程会话模式:

编程会话模式用于ECU软件刷写,此时ECU处于非锁定状态

诊断测试仪发送0x10 02服务请求,会使ECU进入编程会话模式

扩展诊断会话模式:

​​​​​​​ 软件刷写涉及向ECU的非易失存储器写入数据,所以在软件刷写前,需要ECU进入扩展诊断会话模式做准备,可认为这是软件刷写的"预编程"环节,比如禁止ECU记录DTC、禁止ECU发送应用程序报文及网络管理报文,并完成安全访问

只有诊断测试仪通过ECU的安全访问,ECU发送肯定响应报文之后,即会话层使用S_Data.confirm向应用层确认S_Result = S_OK,ECU才会进入诊断测试仪所请求的诊断会话模式,诊断仪才能解锁ECU,获得ECU内部数据信息的权限,进而进入编程会话模式,对ECU进行软件刷写,否则当前诊断会话模式保持不变

诊断测试仪发送0x10 03服务请求,会使ECU进入扩展诊断会话模式

(3)会话超时:

ECU处于不安全的编程会话状态时,诊断测试仪需要周期性地向ECU发送0x3E服务,用于告知ECU诊断测试仪在线,请求ECU不断开诊断会话,发送周期需要小于定时器S3Sever的超时阈值,否则软件刷写会被异常中断

(4)ISO 14229-1规定了不同诊断会话模式下允许的诊断服务。

(5)诊断会话控制请求消息及响应消息的定义:

①请求消息定义:

|-------------|---------------------------------------------|-----|------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | DiagnosticSessionControl Request SID | M | 0x10 |
| #2 | sub-function = [ diagnosticSession Type ] | M | 0x00-0xFF |

其中ISO 14229-1给出了diagnosticSession Type(诊断会话类型,也可将其认为是0x10服务的子功能)的4个选项定义,实际开发中可视情况继续增加可选选项

|--------|---------------------------------------|--------|--------------|
| Hex值 | Description | Cvt | Mnemoic |
| 00 | ISOSAEReserved(预留) | M | ISOSAERESRVD |
| 01 | defaultSession(请求进入默认会话) | M | DS |
| 02 | programmingSession(请求进入编程会话) | U | PRGS |
| 03 | extendedDiagnosticSession(请求进入扩展诊断会话) | U | EXTDS |
| ...... | ...... | ...... | ...... |

②肯定响应消息定义:

|--------------|--------------------------------------------------------|------------|----------------------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | DiagnosticSessionControl Response SID | M | 0x50 |
| #2 | sub-function = [ diagnosticSession Type ] | M | 0x00-0xFF |
| #3 ...... #6 | sessionParameter Record[] = [data#1 ...... data#4] | M ...... M | 0x00-0xFF ...... 0x00-0xFF |

其中ISO 14229-1给出了sessionParameter Record(会话参数记录)的内容定义

|-------------|---------------------------------------------------------------------------------------------------------------|---------|-----------------------------------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 #2 #3 #4 | sessionParameter Record[] = [P2Server_max(高字节) P2Server_max(低字节) P2*Server_max(高字节) P2*Server_max(低字节)] | M M M M | 0x00-0xFF 0x00-0xFF 0x00-0xFF 0x00-0xFF |

P2Server_max与P2*Server_max的定义如下

|----------------|-----------------------------------------------------------------------------------------------|-----------|------------|---------------|---------------|
| Parameter | Description | #of bytes | Resolution | minimum value | Maximum value |
| P2Server_max | Default P2Server_max timing supported by the server for the activated diagnostic session | 2 | 1ms | 0ms | 65535ms |
| P2*Server_max | Enhanced (NRC 0x78) P2Server_max supported by the server for the activated diagnostic session | 2 | 10ms | 0ms | 655350ms |

③否定响应代码NRC定义:

|----------|----------------------------------------------------------|---------|
| NRC Hex值 | Description | Mnemoic |
| 0x12 | sub-functionNotSupported 如果不支持子功能参数,则应发送此NRC | SFNS |
| 0x13 | incorrectMessageLengthOrInvalidFormat 如果消息的长度错误,则应发送此NRC | IMLOIF |
| 0x22 | conditionsNotCorrect 如果不满足请求诊断会话控制的条件,则应发送此NRC | CNC |

(6)在诊断描述文件(.cdd格式)中的依赖性(Dependencies)中可以查看定义的诊断会话转换。(具体查阅CANdelaStudio的使用手册)

(7)抑制肯定响应消息(SPRMIB)在0x10服务中的应用:

在UDS协议中,0x10服务既可以采用物理寻址,也可以采用功能寻址,这取决于具体的应用场景和要切换的会话类型

如果诊断测试仪使用功能寻址的0x10服务进行扩展会话模式切换,它往往不想所有ECU进行响应(为了降低总线负载率),便会发送0x10 83服务请求(SPRMIB位为1),ECU收到此请求后,响应逻辑如下:

①如果ECU可以给出肯定响应,则ECU不发送肯定响应

②如果ECU不接受诊断测试仪的请求,则ECU发送否定响应

4、安全访问(0x27服务)

(1)诊断测试仪可以通过诊断协议访问ECU数据,如果不加以任何安全措施,任意一个"诊断测试仪"都能按照同样的方法访问ECU数据,这显然是很危险的,所以在诊断测试仪访问ECU的数据前,需要进行安全访问。

(2)ECU在上电或复位后会处于锁定状态,诊断测试仪要想读取其中的数据,就需要使用密钥解锁ECU的安全模式,这个过程通过0x27服务实现。

(3)安全访问的步骤:

①诊断测试仪向ECU发出0x27服务请求(向ECU请求种子Seed,种子的长度由原始设备制造商制定)。

②ECU收到0x27服务请求后,向诊断测试仪发回种子Seed,这个种子一般为随机数。

③诊断测试仪收到ECU发回的种子Seed后,根据Seed&Key安全算法(每个项目的安全算法不一定一致)计算Tester端的密钥Key1,再将其发给ECU,Key1应为参数为Seed的种子函数值(即一个Seed不能对应两个Key1)。

④ECU收到密钥Key1后,结合其本地保存的种子Seed、密钥Key1及Seed&Key安全算法计算ECU端的密钥Key2,若Key1与Key2一致,则ECU解锁,否则进入延时。

下图所示为安全等级为m=2n-1时的安全访问流程

如果在收到RequestSeed消息时ECU已经解锁,则ECU应回复包含种子值为0的肯定响应消息(取逆否命题,如果ECU回复的种子值不为0,说明ECU仍未解锁)

(4)安全状态处理:

①ECU在任何时候都只能激活一个安全级别,如果需要切换安全级别,诊断测试仪需再走一遍安全访问流程。

②安全级别编号是任意的,并不意味着级别之间的任何关系。

(5)安全访问请求消息及响应消息的定义:

①请求种子Seed消息定义:

|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|-------------------------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | SecurityAcces Request SID | M | 0x27 |
| #2 | sub-function = [ securityAcces Type = requestSeed ] | M | 0x01,0x03,0x05,0x07-0x7D (奇数) |
| #3 ...... #n | securityAccesDataRecord[] = [parameter#1 ...... parameter#m] 种子参数是服务器发送的数据值,在计算访问安全性所需的密钥时由客户端使用,如果请求消息是在子功能设置为请求服务器种子的值的情况下发送的,则securitySeed数据字节仅存在于响应消息中 | U ...... U | 0x00-0xFF ...... 0x00-0xFF |

②发送密钥Key消息定义:

|--------------|-------------------------------------------------------------------------------------------------|------------|-------------------------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | SecurityAcces Request SID | M | 0x27 |
| #2 | sub-function = [ securityAcces Type = sendKey ] | M | 0x02,0x04,0x06,0x08-0x7E (偶数) |
| #3 ...... #n | securityKey[] = [Key#1(high byte) ...... Key#m(low byte)] 请求消息中的"密钥"参数是由对应于特定"种子"值的安全算法生成的值 | M ...... U | 0x00-0xFF ...... 0x00-0xFF |

③肯定响应消息定义:

|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|----------------------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | SecurityAcces Response SID | M | 0x67 |
| #2 | sub-function = [ securityAcces Type ] | M | 0x00-0x7F |
| #3 ...... #n | securityAccesSeed[] = [seed#1(high byte) ...... Seed#m(low byte)] 种子参数是服务器发送的数据值,在计算访问安全性所需的密钥时由客户端使用,如果请求消息是在子功能设置为请求服务器种子的值的情况下发送的,则securitySeed数据字节仅存在于响应消息中 | C ...... C | 0x00-0xFF ...... 0x00-0xFF |
| C:此参数的存在取决于securityAccessType参数,如果securityAccessType参数指示客户端想要从服务器检索种子,则必须存在 ||||

④否定响应代码NRC定义:

|----------|---------------------------------------------------------------------------|---------|
| NRC Hex值 | Description | Mnemoic |
| 0x12 | sub-functionNotSupported 如果不支持子功能参数,则应发送此NRC | SFNS |
| 0x13 | incorrectMessageLengthOrInvalidFormat 如果消息的长度错误,则应发送此NRC | IMLOIF |
| 0x22 | conditionsNotCorrect 如果不满足请求安全访问的条件,则应发送此NRC | CNC |
| 0x24 | requestSequenceError 如果在没有收到"requestSeed"请求消息的情况下接收到"sendKey"子功能,则应发送此NRC | RSE |
| 0x31 | requestOutOfRange 如果用户可选的securityAccesDataRecord包含无效数据,则应发送此NRC | ROOR |
| 0x35 | invalidKey 如果收到预期的"sendKey"子功能值并且密钥的值与ECU内部存储/计算的密钥不匹配,则应发送此NRC | IK |
| 0x36 | exceededNumberOfAttempts 如果延迟定时器由于超过允许的最大非法访问尝试次数而处于活动状态,则应发送此NRC | ENOA |
| 0x37 | requiredTimeDelayNOTExpired 如果延迟定时器处于活动状态并发送请求,则应发送此NRC | RTDNE |

(6)在诊断描述文件(.cdd格式)中的依赖性(Dependencies)中可以定义的安全等级转换。(具体查阅CANdelaStudio的使用手册)

5、通信控制(0x28服务)

(1)通信控制用于打开/关闭服务器的某些消息的发送和/或接收,例如应用程序通信消息、网络管理通信消息,在降低总线负载率时可考虑此服务。

(2)通信控制请求消息及响应消息的定义:

①请求消息定义:

|-------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|---------------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | CommunicationControl Request SID | M | 0x28 |
| #2 | sub-function = [ control Type ] | M | 0x00-0xFF |
| #3 | communication Type 此参数用于引用要控制的通信类型,它是位代码值,允许同时控制多种通信类型(编码表请查阅ISO 14229-1) | M | 0x00-0xFF |
| #4 #5 | nodeIdentificationNumber(high byte) nodeIdentificationNumber(low byte) 此参数用于识别车辆某处的子网络上的节点,该节点不能使用较低OSI层1至6的寻值方法来寻值 如果子功能参数control Type设置为0x04或0x05,则此参数存在 | Ca Ca | 0x00-0xFF 0x00-0xFF |

请求消息子功能参数的定义如下所示

|-------|------------------------------------------------------------------------------------|-----|--------------|
| Hex值 | Description | Cvt | Mnemoic |
| 00 | enableRxAndTx 该值表示应为指定的communication Type启用消息的接收和传输 | U | ERXTX |
| 01 | enableRxAndDisableTx 该值表示应启用消息接收,并且应禁用指定的communication Type传输 | U | ERXDTX |
| 02 | enableRxAndEnableTx 该值表示应禁用消息接收,并且应为指定的communication Type启用传输 | U | DRXETX |
| 03 | disableRxAndTx 该值表示应对指定的communication Type禁用消息的接收和发送 | U | DRXTX |
| 04 | enableRxAndDisableTxWithEnhancedAddressInformation 该值表示寻址的总线主控器应将相关的子总线段切换到仅诊断调度模式 | U | ERXDTXWEAI |
| 05 | enableRxAndTxWithEnhancedAddressInformation 该值表示寻址的总线主控器应将相关的子总线段切换到应用程序调度模式 | U | ERXTXWEAI |
| 06-3F | ISOSAReserved 保留值范围,用于将来定义 | M | ISOSAERESRVD |
| 40-5F | vehicleManufactureSpecific 该值范围保留,供车辆制造商特定用途 | U | VMS |

②肯定响应消息定义:

|-------------|-----------------------------------------|-----|------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | CommunicationControl Response SID | M | 0x68 |
| #2 | sub-function = [ communication Type ] | M | 0x00-0x7F |

③否定响应代码NRC定义:

|----------|--------------------------------------------------------------------------------------|---------|
| NRC Hex值 | Description | Mnemoic |
| 0x12 | sub-functionNotSupported 如果不支持子功能参数,则应发送此NRC | SFNS |
| 0x13 | incorrectMessageLengthOrInvalidFormat 如果消息的长度错误,则应发送此NRC | IMLOIF |
| 0x22 | conditionsNotCorrect 在服务器处于关键的正常模式(inacritical nomal mode)活动时使用,因此无法禁用/启用请求的通信类型 | CNC |
| 0x31 | requestOutOfRange 如果ECU检测到communication Type或nodeIdentificationNumber参数中有错误,则应发送此NRC | ROOR |

(3)应用举例:

①禁用网络管理消息的发送。

请求消息流:

|-------------|----------------------------------------------------------------------------|------------|
| A_Data byte | Parameter Name | Byte Value |
| #1 | CommunicationControl Request SID | 0x28 |
| #2 | control Type = enableRXAndDisableTx suppressPosRspMsgIndicationBit = FALSE | 0x01 |
| #3 | communication Type = network management | 0x02 |

响应消息流:

|-------------|---------------------------------------------------------------------------|------------|
| A_Data byte | Parameter Name | Byte Value |
| #1 | CommunicationControl Response SID | 0x68 |
| #2 | ControlType = enableRXAndDisableTx suppressPosRspMsgIndicationBit = FALSE | 0x01 |

②将远程网络切换到仅诊断调度模式,其中连接了地址为0x000A的节点。

请求消息流:

|-------------|----------------------------------------------------------------------------------------------------------|------------|
| A_Data byte | Parameter Name | Byte Value |
| #1 | CommunicationControl Request SID | 0x28 |
| #2 | control Type = enableRxAndDisableTxWithEnhancedAddressInformation suppressPosRspMsgIndicationBit = FALSE | 0x04 |
| #3 | communication Type = normal messages | 0x01 |
| #4 | nodeIdentificationNumber(high byte) | 0x00 |
| #5 | nodeIdentificationNumber(low byte) | 0x0A |

响应消息流:

|-------------|----------------------------------------------------------------------------------------------------------|------------|
| A_Data byte | Parameter Name | Byte Value |
| #1 | CommunicationControl Response SID | 0x68 |
| #2 | control Type = enableRxAndDisableTxWithEnhancedAddressInformation suppressPosRspMsgIndicationBit = FALSE | 0x04 |

③切换到具有增强的地址信息的应用程序调度模式,连接到子网络的节点0x000A。

请求消息流:

|-------------|---------------------------------------------------------------------------------------------------|------------|
| A_Data byte | Parameter Name | Byte Value |
| #1 | CommunicationControl Request SID | 0x28 |
| #2 | control Type = enableRxAndTxWithEnhancedAddressInformation suppressPosRspMsgIndicationBit = FALSE | 0x05 |
| #3 | communication Type = normal messages | 0x01 |
| #4 | nodeIdentificationNumber(high byte) | 0x00 |
| #5 | nodeIdentificationNumber(low byte) | 0x0A |

响应消息流:

|-------------|---------------------------------------------------------------------------------------------------|------------|
| A_Data byte | Parameter Name | Byte Value |
| #1 | CommunicationControl Response SID | 0x68 |
| #2 | control Type = enableRxAndTxWithEnhancedAddressInformation suppressPosRspMsgIndicationBit = FALSE | 0x05 |

④在进行ECU软件刷写前,首先请求ECU进入扩展诊断会话模式,为了尽可能地降低网络的通信负载率,需要禁止ECU向总线发送非诊断信息,包括网络管理通信消息和正常通信消息。

请求消息流:

|-------------|----------------------------------------------------------------------------|------------|
| A_Data byte | Parameter Name | Byte Value |
| #1 | CommunicationControl Request SID | 0x28 |
| #2 | control Type = enableRXAndDisableTx suppressPosRspMsgIndicationBit = FALSE | 0x01 |
| #3 | communication Type = network management and normal communication | 0x03 |

响应消息流:

|-------------|---------------------------------------------------------------------------|------------|
| A_Data byte | Parameter Name | Byte Value |
| #1 | CommunicationControl Response SID | 0x68 |
| #2 | ControlType = enableRXAndDisableTx suppressPosRspMsgIndicationBit = FALSE | 0x01 |

6、测试仪在线(0x3E服务)

(1)0x3E服务用于周期性向ECU(或多个ECU)指示诊断测试仪仍然连接到ECU,并且先前已激活的某些诊断服务和/或通信将保持活动。

(2)测试仪在线请求消息及响应消息的定义:

①请求消息定义:

|-------------|--------------------------------------|-----|------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | TesterPresent Request SID | M | 0x3E |
| #2 | sub-function = [ zeroSubFunction ] | M | 0x00/0x80 |

请求消息子功能参数的定义如下所示

|-------|---------------------------------------------------------------------|-----|--------------|
| Hex值 | Description | Cvt | Mnemoic |
| 00 | zeroSubFunction 该参数值用于指示此服务不支持suppressPosRspMsgIndicationBit旁边的子功能值 | M | ZSUBF |
| 01-7F | ISOSAEReserved 此值范围保留 | M | ISOSAERESRVD |

②肯定响应消息定义:

|-------------|--------------------------------------|-----|------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | TesterPresent Response SID | M | 0x7E |
| #2 | sub-function = [ zeroSubFunction ] | M | 0x00 |

③否定响应代码NRC定义:

|----------|----------------------------------------------------------|---------|
| NRC Hex值 | Description | Mnemoic |
| 0x12 | sub-functionNotSupported 如果不支持子功能参数,则应发送此NRC | SFNS |
| 0x13 | incorrectMessageLengthOrInvalidFormat 如果消息的长度错误,则应发送此NRC | IMLOIF |

7、控制故障码设置(0x85服务)

(1)0x85服务用于请求停止或恢复单个ECU或一组ECU中DTC状态位的更新。

(2)控制故障码设置请求消息及响应消息的定义:

①请求消息定义:

|--------------|-----------------------------------------------------------------------------------------------------------------------------------|------------|----------------------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | Control DTC Setting Request SID | M | 0x85 |
| #2 | sub-function = [ DTCSetting Type ] | M | 0x00-0xFF |
| #3 ...... #n | DTCSettingControlOptionRecord[] = [parameter#1 ...... parameter#m] 当控制DTC状态位的更新时,该参数记录是用户可选的,用于将数据发送到服务器,例如,它可以包含要打开或关闭的DTC列表 | U ...... U | 0x00-0xFF ...... 0x00-0xFF |

请求消息子功能参数的定义如下所示

|-------|-------------------------------------------|-----|--------------|
| Hex值 | Description | Cvt | Mnemoic |
| 00 | ISOSAEReserved 此值保留 | M | ISOSAERESRVD |
| 01 | on ECU应根据正常操作条件恢复故障诊断代码状态位的更新 | M | ON |
| 02 | off ECU应停止更新诊断故障代码状态位 | M | OFF |
| 03-3F | ISOSAEReserved 此值范围保留 | M | ISOSAERESRVD |
| 40-5F | vehicleManufactureSpecific 此值范围供车辆制造商特定用途 | U | VMS |
| 60-7E | systemSupplierSpecific 此值范围保留给系统供应商特定用途 | U | SSS |
| 7F | ISOSAEReserved 此值保留 | M | ISOSAERESRVD |

②肯定响应消息定义:

|-------------|----------------------------------|-----|------------|
| A_Data byte | Parameter Name | Cvt | Byte Value |
| #1 | Control DTC Setting Response SID | M | 0xC5 |
| #2 | DTCSetting Type | M | 0x00-0x7F |

③否定响应代码NRC定义:

|----------|----------------------------------------------------------------------|---------|
| NRC Hex值 | Description | Mnemoic |
| 0x12 | sub-functionNotSupported 如果不支持子功能参数,则应发送此NRC | SFNS |
| 0x13 | incorrectMessageLengthOrInvalidFormat 如果消息的长度错误,则应发送此NRC | IMLOIF |
| 0x22 | conditionsNotCorrect ECU无法执行请求的DTC控制功能,则应发送此NRC | CNC |
| 0x31 | requestOutOfRange 如果ECU检测到DTCSettingControlOptionRecord存在错误,则应发送此NRC | ROOR |

相关推荐
『往事』&白驹过隙;4 小时前
系统编程的内存零拷贝(Zero-Copy)技术
linux·c语言·网络·c++·物联网·iot
济6174 小时前
ARM Linux 驱动开发篇---新版led驱动实验程序编写-- Ubuntu20.04
嵌入式·嵌入式linux驱动开发
『往事』&白驹过隙;5 小时前
在ARM开发中 volatile与const关键字的关键用途
c语言·arm开发·mcu·物联网·学习·iot
风痕天际1 天前
ESP32-S3开发教程6:硬件定时器
单片机·嵌入式硬件·嵌入式·esp32·freertos·esp32s3
小灰灰搞电子1 天前
ESP32+ESP-IDF 使用MQTT协议连接阿里云物联网平台源码分享
物联网·阿里云·esp32
Web3VentureView2 天前
X Space AMA回顾|预测熊市底部:当市场寻找价格,SYNBO正在构建未来
人工智能·物联网·金融·web3·区块链
JialBro2 天前
【嵌入式】直流无刷电机FOC控制算法全解析
算法·嵌入式·直流·foc·新手·控制算法·无刷电机
良许Linux2 天前
FPGA原理和应用
stm32·单片机·fpga开发·程序员·嵌入式·编程
勇敢牛牛_2 天前
ESP32 + Rust 开发的简易语音助手
rust·嵌入式·esp32·语音助手