UDS 诊断服务系列文章目录
诊断和通信管理功能单元
UDS 诊断 - DiagnosticSessionControl(诊断会话控制)(0x10)服务
UDS 诊断 - ECUReset(ECU重置)(0x11)服务
UDS 诊断 - SecurityAccess(安全访问)(0x27)服务
UDS 诊断 - CommunicationControl(通信控制)(0x28)服务
UDS 诊断 - TesterPresent(测试仪保活)(0x3E)服务
UDS 诊断 - AccessTimingParameter(访问计时参数)(0x83)服务
UDS 诊断 - SecuredDataTransmission(受保护的数据传输)(0x84)服务
UDS 诊断 - ControlDTCSetting(控制DTC设置)(0x85)服务
UDS 诊断 - ResponseOnEvent(基于事件响应)(0x86)服务
UDS 诊断 - LinkControl(链路控制)(0x87)服务
数据传输功能单元
UDS 诊断 - ReadDataByIdentifier(按标识符读取数据)(0x22)服务
UDS 诊断 - ReadMemoryByAddress(按地址读取内存)(0x23)服务
UDS 诊断 - ReadScalingDataByIdentifier(按标识符读取换算数据)(0x24)服务
UDS 诊断 - ReadDataByPeriodicIdentifier(按周期性标识符读取数据)(0x2A)服务
UDS 诊断 - DynamicallyDefineDataIdentifier(动态定义数据标识符)(0x2C)服务
UDS 诊断 - WriteDataByIdentifier(按标识符写数据)(0x2E)服务
UDS 诊断 - WriteMemoryByAddress(按地址写内存)(0x3D)服务
存储数据传输功能单元
UDS 诊断 - ClearDiagnosticInformation(清除诊断信息)(0x14)服务
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(1) - 服务说明
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(2) - 请求消息
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(3) - 响应消息
UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(4) - 示例
输入输出控制功能单元
UDS 诊断 - InputOutputControlByIdentifier(按标识符的输入输出控制)(0x2F)服务
例程功能单元
UDS 诊断 - RoutineControl(例程控制)(0x31)服务
上传下载功能单元
UDS 诊断 - RequestDownload(请求下载)(0x34)服务
UDS 诊断 - RequestUpload(请求上传)(0x35)服务
UDS 诊断 - TransferData(传输数据)(0x36)服务
一、 服务说明
客户端利用 TransferData(传输数据)服务从客户端向服务器(下载)或从服务器向客户端(上传)传输数据。
数据传输方式取决于前述 RequestDownload(请求下载)或 RequestUpload(请求上传)服务。如果客户端发出 RequestDownload,则待下载数据包含在 TransferData 请求消息中的 transferRequestParameter(传输请求参数)内。如果客户端发出的 RequestUpload,则待上传数据包含在 TransferData 响应消息中的 transferResponseParameter(传输响应参数)内。
TransferData 服务请求包含 blockSequenceCounter(快序列计数器),以便在请求一序列 TransferData 过程中 TransferData 服务失败时提高错误处理。收到 RequestDownload(0x34)或 RequestUpload(0x35)消息是,服务器的 blockSequenceCounter 应初始化为 1。这表示 RequestDownload 或 RequestUpload 消息之后的首个 TransferData 请求消息是从 blockSequenceCounter 1 开始。
二、请求消息
1. 请求消息定义
字节 | 参数名称 | Cvt | 字节值 |
---|---|---|---|
#1 | TransferData(传输数据) 请求 SID | M | 0x36 |
#2 | blockSequenceCounter(块序列计数器) | M | 0x00 - 0xFF |
#3 … #n | transferRequestParameterRecord[] = [ transferRequestParameter#1 … transferRequestParameter#m ] | C … U | 0x00 - 0xFF … 0x00 - 0xFF |
C:如果正在下载,则此参数为强制参数。
2. 请求消息数据参数定义
定义 |
---|
blockSequenceCounter(块序列计数器) blockSequenceCounter(块序列计数器)参数值从 0x01 开始,第一个 TransferData 请求在 RequestDownload 或 RequestUpload 服务器之后。TransferData 请求每增加一次,参数值加 1。参数值为 0xFF 时,blockSequenceCounter(块序列计数器)翻滚并从 0x00 开始发出下一条 TransferData 请求消息。 示例: - 如果下载数据要求 TransferData 请求被服务器正确接收和处理,但肯定响应消息未达到客户端,则客户端会认为应用层超时并重复相同的请求(包括同一 blockSequenceCounter(块序列计数器))。这样,服务器会接收重复 TransferData 请求并根据计入的 blockSequenceCounter(块序列计数器)确定 TransferData 请求重复。然后服务器不再重复写入数据,而是立即将肯定响应消息发送到服务器内存中。 - 如果下载数据要求的 TransferData 请求未被服务器正确接收,则服务器不会发出肯定响应消息。客户端会认为应用层超时并会重复相同的请求(包括同一 blockSequenceCounter)。这样,服务器会接收重复 TransferData 请求并根据计入的 blockSequenceCounter 确定该请求为新 TransferData 请求。然后服务器会处理服务并发送肯定响应消息。 - 如果上传数据要求的 TransferData 请求被服务器正确接收和处理,但肯定响应消息未到达客户端,则客户端会认为应用层超时并重复相同的请求(包括同一 blockSequenceCounter)。这样,服务器会接收重复 TransferData 请求并根据计入的 blockSequenceCounter 确定 TransferData 请求重复。然后一访问到之前提供的数据,服务器会立即再次向其内存发送肯定响应消息。 - 如果上传数据要求的 TransferData 请求未被服务器正确接收,则服务器不会发出肯定响应消息。客户端会认为应用层超时并会重复相同的请求(包括同一 blockSequenceCounter )。这样,服务器会接收重复 TransferData 请求并根据计入的 blockSequenceCounter 确定该请求为新 TransferData 请求。然后服务器会处理服务并发送肯定响应消息。 |
transferRequestParameterRecord(传输请求参数记录) 此参数记录包含服务器要求的支持数据传输的参数。参数格式和长度由车辆制造商规定。 示例:下载时,transferRequestParameterRecord 包括待传输的数据。 |
三、肯定响应消息
1. 肯定响应消息定义
字节 | 参数名称 | Cvt | 字节值 |
---|---|---|---|
#1 | TransferData(传输数据)响应SID | M | 0x76 |
#2 | blockSequenceCounter(块序列计数器) | M | 0x00 - 0xFF |
#3 … #n | transferResponseParameterRecord[] = [ transferResponseParameter#1 … transferResponseParameter#m ] | C … U | 0x00 - 0xFF … 0x00 - 0xFF |
C:如果正在上传,则此参数为强制参数。
2. 肯定响应消息数据参数的定义
定义 |
---|
blockSequenceCounter(块序列计数器) 此参数是请求消息的 blockSequenceCounter 参数的反射。 |
transferResponseParameterRecord(传输响应参数记录) 此参数应包含客户端支持数据传输要求的参数。参数格式和长度由车辆制造商规定。 示例:下载时,transferResponseParameterRecord 参数可以包含服务器计算出的校验和。上传时,transferResponseParameterRecord 参数包含上传数据。下载时,transferResponseParameterRecord 参数不得重复 transferRequestParameterRecord。 |
四、受支持的 NRC
NRC | 说明 |
---|---|
0x13 | 消息不正确或格式无效 如果消息长度错误(如消息长度不符合肯定响应消息对 RequestDownload 服务回应的 maxNumberOfBlockLength 参数要求),则应发送此 NRC。 |
0x24 | 请求序列错误 下列情况中,服务器应使用此响应码: - 收到 RequestDownload 或 RequestUpload 服务请求时,RequestDownload 或 RequestUpload 服务未激活; - RequestDownload 或 RequestUpload 服务激活,但服务器已接收到 RequestDownload 或 RequestUpload 服务中的 memorySize 参数确定的所有数据; 注:利用 BlockSequenceCounter 接收到的与其中一条历史 TransferData 请求消息等效的 TransferData 请求消息应可以被服务器接受。 |
0x31 | 请求超过限值 下述情况下,应返回此 NRC: - transferRequestParameterRecord 包含附加控制参数(如附加地址信息),但此控制信息无效。 - transferRequestParameterRecord 与 RequestDownload 或 RequestUpload 服务参数 maxNumberOfBlockLength 不符。 - transferRequestParameterRecord 不符合服务器的内存对齐限制。 |
0x71 | 传输数据暂停 如果下载模块长度不符合 RequestDownload 服务的请求消息中发送的 memorySize 参数要求,则此 NRC 会被返回。 |
0x72 | 一般编程故障 下载数据过程中,如果服务器在清除或编程永久性存储器(如快闪存储器)中的内存位置检测到错误,则此 NRC 会被返回。 |
0x73 | 错误块序列计数器 如果服务器在序列 BlockSequenceCounter 中检测到错误,则此 NRC 会被返回。 注:利用 BlockSequenceCounter 接收到的与其中一条历史 TransferData 请求消息等效的 TransferData 请求消息应可以被服务器接受。 |
0x92 / 0x93 | 电压过高 / 电压过低 如果在服务器的主电源接脚处测得的电压超出将数据下载到服务器永久性存储器(如快闪存储器)所需电压的可接受范围,则应发送此 NRC。 |
下为 0x36 服务的 NRC 处理。
图例
1 如果正在执行 RequestUpload 服务,则最小长度必须为 2,如果正在执行 RequestDownload 服务,则 最小长度至少为 3(SI + BlockSequenceCounter + 最小 transferRequestParameterRecord)
本节示例见 UDS 诊断 - RequestTransferExit(请求传输终止)(0x37)服务