
在嵌入式系统领域,UDS(Unified Diagnostic Services)诊断协议被广泛应用于ECU诊断、汽车行业以及其他嵌入式设备中。
在嵌入式开发面试中,面试官经常会问关于UDS诊断的相关问题,以考察候选人在这方面的专业知识及实际应用能力。
以下是一些常见的UDS诊断问题以及详细的解答,文章设计上侧重于深入分析和实际应用。
1
UDS协议的层次结构
在开放系统互连(OSI)基本参考模型中规定了各类物理层通信对应部分的UDS诊断协议。
例如,CAN通信(ISO 11898-1、ISO 11898-2和ISO 11898-3)在应用层的UDS诊断协议是ISO 14229-1和ISO 14229-3。

2
UDS有哪些常用服务?

3
UDS 协议中的不同帧类型有哪些?
UDS 通信使用以下主要帧类型:
4
UDS报文结构与响应机制
以诊断和通信管理功能单元(Diagnostic and Communication Management functional unit )为例,服务请求和响应有两类:一类是具有Subfunction(子功能),另一类是不具有Subfunction(子功能)。
不具有Subfunction(子功能)的UDS诊断服务请求和响应机制如下图所示:

诊断方(Tester)向ECU发送指定的请求数据(Request),这条数据中需要包含SID,且SID处于该应用层数据的第一个字节。
ECU接收到请求数据(Request)后会返回响应,可返回肯定响应或者否定响应。
肯定响应(Positive Response)格式为:(SID+0X40)+数据。例如,请求0X10服务,肯定响应第1个字节为0X50;请求0X22服务,肯定响应第1个字节为0X62。
否定响应(Negative Response)格式为:0X7F+SID+NRC。例如,请求0X10服务,否定响应第1个字节为固定的0X7F,第2个字节为0X10,第3个字节为NRC。NRC是否定响应码,可以根据返回的NRC判断是什么原因导致的否定响应。
具有Subfunction(子功能)的UDS诊断服务请求和响应机制如下图所示:

诊断方(Tester)向ECU发送指定的请求数据(Request),这条数据中需要包含SID,且SID处于该应用层数据的第一个字节。
ECU接收到请求数据(Request)后会返回响应,可返回肯定响应或者否定响应。
肯定响应(Positive Response)格式为:(SID+0X40)+Subfunction(子功能)+数据。例如,请求0X10服务,Subfunction(子功能)为0X02,肯定响应第1个字节为0X50,第2个字节为0X02。
否定响应(Negative Response)格式为:0X7F+SID+NRC。例如,请求0X10服务,否定响应第1个字节为固定的0X7F,第2个字节为0X10,第3个字节为NRC。NRC是否定响应码,可以根据返回的NRC判断是什么原因导致的否定响应。
5
常见NRC代码

6
详细说明服务 0x27 (SecurityAccess) 的工作流程
服务 0x27 (安全访问) 是UDS中用于保护ECU关键功能(如刷写、修改标定参数等)的核心机制。它采用 “种子(Seed)-密钥(Key)”质询-响应 机制来验证客户端的合法性。
详细工作流程如下:
7
假如ECU多次错误输入Key会发生什么?
ECU会进入安全锁定状态(Security Lock),需要冷启动或超时解除。
该机制防止暴力破解。
8
谈谈你对服务 0x19 (ReadDTCInformation) 的理解
服务 0x19 (读取DTC信息) 是诊断的灵魂功能,用于从ECU的故障存储器中读取诊断故障码(DTC)及其相关信息。它拥有非常多的子功能,用于实现灵活的故障查询。
常用子功能举例:
9
DTC的状态字节 (Status Byte) 是如何构成的?
DTC状态字节 (DTC Status Byte) 是精髓所在,它用一个字节的8个比特位来精确描述一个DTC的当前状态,是判断故障性质的关键。
其结构如下:

核心位解释:
10
UDS Bootloader的典型升级流程
以下是固件升级服务的典型顺序:
10 02 → 进入编程会话
27 01/27 02 → 安全认证
34 xx xx → 请求下载
36 ... → 分块传输数据
37 → 结束传输
31 01 FF00 → 校验程序
11 01 → 软复位更详细的步骤可见下图。

11
Tester Present(0x3E)的作用
UDS协议要求诊断会话在超时TsessionTimeout(典型值5s)内保持活跃。
若测试仪无操作,ECU会自动返回默认会话。
因此,上位机需周期性发送:
02 3E 00 → TesterPresent该命令本身无功能性意义,仅维持诊断连接。
12
写一段代码,解析UDS请求帧
typedef struct {
uint8_t SID;
uint8_t SubFunc;
uint8_t data[8];
uint8_t len;
} UDS_Msg_t;
void UDS_ParseRequest(uint8_t *rxBuf, uint8_t len)
{
UDS_Msg_t req;
req.len = rxBuf[0];
req.SID = rxBuf[1];
req.SubFunc = rxBuf[2];
switch(req.SID)
{
case 0x10:
if(req.SubFunc == 0x02)
UDS_SendResponse(0x50, 0x02); // 编程会话
break;
case 0x3E:
UDS_SendResponse(0x7E, 0x00); // TesterPresent响应
break;
default:
UDS_SendNegResponse(req.SID, 0x11); // 服务不支持
break;
}
}13
UDS 中的物理寻址和功能寻址有何区别?
物理寻址:使用唯一地址针对单一 ECU(例如,CAN ID 0x7A1 请求,0x7A9 响应)。适用于 ECU 特定任务如重编程。
功能寻址:广播到组或功能(例如,CAN ID 0x7DF),允许多个 ECU 响应(如适用)。它高效用于全局查询,但风险碰撞,通过响应抑制缓解。 这种区别优化车辆网络带宽,物理寻址更适合敏感操作的安全性。
14
UDS 中的诊断会话是什么,有哪些类型?
诊断会话定义 ECU 的操作模式,控制服务可用性。类型包括:
15
当诊断请求的报文长度超过一帧CAN报文时,UDS是如何处理的?
当UDS报文(如包含长DID数据的62响应)超过7字节(单帧CAN网络,1字节PCI)时,就需要CAN-TP(也称ISO-TP)来进行分包和流控。
CAN-TP定义了四种帧类型 (PCI - Protocol Control Information):
16
请解释CAN-TP(ISO 15765-2)的多帧通信机制
多帧通信流程:
这个机制确保了即使在总线负载较高或接收方处理能力有限的情况下,长数据也能被可靠、有序地传输,而不会导致数据丢失或接收方缓冲区溢出。