网易首页 > 网易号 > 正文 申请入驻

UDS诊断服务详解:上传下载功能单元(0x34/0x35/0x36/0x37)及C++实现

0
分享至


在汽车电子诊断领域,UDS(Unified Diagnostic Services,统一诊断服务)是ISO 14229标准定义的一套通用诊断协议。其中“上传下载功能单元”(Upload Download functional unit)用于在诊断工具(Tester)与ECU之间传输大量数据,例如固件升级、标定数据读取/写入、配置备份恢复等。该单元包含四个核心服务:

  • 0x34 RequestDownload(请求下载)

  • 0x35 RequestUpload(请求上传)

  • 0x36 TransferData(传输数据)

  • 0x37 RequestTransferExit(请求传输退出)

本文将逐一讲解这些服务的报文格式、通信流程,并给出基于C++的简化实现示例,帮助开发者快速集成到诊断工具或自动化测试脚本中。

一、UDS基础回顾

UDS基于客户端-服务器模型,诊断工具作为客户端(Tester),ECU作为服务器。所有请求/响应报文均遵循统一的寻址和子功能定义。传输层通常使用CAN(ISO 15765)、LIN或以太网(DoIP)。

上传下载功能单元在设计上考虑了可靠性、流控和分段传输,尤其适合传输超过单帧报文长度的数据。

二、服务详解 1. 0x34 RequestDownload(请求下载)

用途:客户端通知ECU即将开始数据下载(即向ECU写入数据),并告知数据长度和起始地址等信息。ECU回应其可以接收的最大数据长度(每块大小)。

请求报文格式(以CAN/CAN FD为例):

字节位置

参数名

0

0x34

服务ID

1

数据格式标识(dataFormatIdentifier)

通常为0x00,表示未压缩、未加密

地址和长度信息(addressAndLengthFormatIdentifier)

高4位:内存地址字节数;低4位:数据长度字节数

内存地址(memoryAddress)

可变字节(由前述高4位决定)

数据长度(memorySize)

可变字节(由前述低4位决定)

响应报文(肯定响应):

字节位置

参数名

0

0x74

服务ID + 0x40

1

数据格式标识(echo)

回显请求中的值

maxNumberOfBlockLength

每块传输的最大数据字节数(3字节)

注意:ECU会校验请求中的地址/长度是否合法,若无法满足则返回否定响应(例如NRC 0x31 RequestOutOfRange)。

2. 0x35 RequestUpload(请求上传)

用途:客户端请求从ECU上传数据(即读取ECU内存)。其报文结构类似于RequestDownload,区别在于服务ID和语义。

请求报文格式:

字节

内容

0

0x35

1

数据格式标识

2

地址+长度格式标识

内存地址(起始地址)

数据长度(要读取的字节数)

肯定响应:

字节

内容

0

0x75

1

数据格式标识(echo)

maxNumberOfBlockLength(每块能返回的最大字节数)


3. 0x36 TransferData(传输数据)

用途:真正承载数据块。下载时客户端发送数据给ECU;上传时ECU返回数据给客户端。通过多次调用0x36服务完成全部数据传送。

请求报文格式(下载方向):

字节

内容

0

0x36

1

blockSequenceCounter(块序列计数器,0x01开始,循环使用0x00~0xFF)

数据字节(长度 ≤ maxNumberOfBlockLength)

响应报文(下载时ECU回复):

字节

内容

0

0x76

1

blockSequenceCounter(回显请求中的计数)

对于上传方向,客户端发送0x36请求(仅带序列计数器,无数据载荷),ECU在响应中携带数据。

4. 0x37 RequestTransferExit(请求传输退出)

用途:在所有数据块传输完成后,客户端发送此服务通知ECU传输结束,ECU进行完整性校验或关闭会话上下文。

请求报文:

字节

内容

0

0x37

肯定响应:0x77

三、典型通信流程(以下载为例)

  1. 进入扩展会话(可选但推荐):使用0x10服务切换至编程会话,并解锁安全访问(0x27服务)获得写入权限。

  2. 发送RequestDownload:告知起始地址(例如0x8000)和数据总长度(4096字节)。ECU回复允许的块大小(如256字节)。

  3. 循环发送TransferData:将4096字节拆分为16块(每块256字节),每块发送一条0x36服务(块计数递增)。ECU每块回复0x76确认。

  4. 发送RequestTransferExit:通知ECU传输结束。ECU回复0x77。

  5. 执行完整性校验或复位(可选)。

四、C++实现讲解

下面给出一个简化的C++类,模拟诊断工具侧对上述服务的封装。实际项目中会依赖硬件通信库(如CAN卡API),此处用抽象接口表示发送/接收。

1. 基础诊断通信接口

// DiagnosticChannel.h - 抽象传输层
class DiagnosticChannel {
public:
virtual ~DiagnosticChannel() = default;
virtual std::vector request(const std::vector& requestData) = 0;
// 底层需处理ISO-TP分段、流控和超时
};
2. 上传下载功能类

#include  

#include
#include

class UploadDownloadService {
public:
UploadDownloadService(DiagnosticChannel* channel) : m_channel(channel) {}

// 请求下载
bool requestDownload(uint32_t memoryAddress, uint32_t memorySize,
uint16_t& maxBlockSize) {
// 构建请求 (简化:固定地址长度4字节,数据长度4字节)
std::vector request;
request.push_back(0x34); // SID
request.push_back(0x00); // dataFormatIdentifier
request.push_back(0x44); // addressAndLengthFormat: 地址4字节,长度4字节
// 内存地址 (大端)
request.push_back((memoryAddress >> 24) & 0xFF);
request.push_back((memoryAddress >> 16) & 0xFF);
request.push_back((memoryAddress >> 8) & 0xFF);
request.push_back(memoryAddress & 0xFF);
// 数据长度 (大端)
request.push_back((memorySize >> 24) & 0xFF);
request.push_back((memorySize >> 16) & 0xFF);
request.push_back((memorySize >> 8) & 0xFF);
request.push_back(memorySize & 0xFF);

auto response = m_channel->request(request);
if (response.empty() || response[0] != 0x74) {
return false; // 处理否定响应可细化NRC
}
// 解析 maxNumberOfBlockLength (3字节,大端)
if (response.size() >= 5) {
maxBlockSize = (response[2] << 16) | (response[3] << 8) | response[4];
}
return true;
}

// 传输单块数据 (下载方向)
bool transferData(uint8_t blockCounter, const std::vector& data) {
std::vector request;
request.push_back(0x36);
request.push_back(blockCounter);
request.insert(request.end(), data.begin(), data.end());

auto response = m_channel->request(request);
return (!response.empty() && response[0] == 0x76 && response[1] == blockCounter);
}

// 请求退出传输
bool requestTransferExit() {
std::vector request = {0x37};
auto response = m_channel->request(request);
return (!response.empty() && response[0] == 0x77);
}

// 高级封装:下载完整数据
bool downloadData(uint32_t address, const std::vector& data) {
uint16_t maxBlockSize = 0;
if (!requestDownload(address, static_cast(data.size()), maxBlockSize)) {
return false;
}
if (maxBlockSize == 0) return false;

uint8_t counter = 1;
size_t offset = 0;
while (offset < data.size()) {
size_t chunkSize = std::min(maxBlockSize, static_cast(data.size() - offset));
std::vector chunk(data.begin() + offset, data.begin() + offset + chunkSize);
if (!transferData(counter++, chunk)) {
return false;
}
offset += chunkSize;
}
return requestTransferExit();
}

private:
DiagnosticChannel* m_channel;
};
3. 上传功能类似实现

上传的流程中,transferData请求不带数据,而是从响应中提取数据块:

// 上传功能扩展
std::vector uploadData(uint32_t address, uint32_t size) {
std::vector result;
// 1. RequestUpload ...
// 2. 循环发送TransferData (不带数据载荷)
// 3. 从响应中获取数据并拼接
// 4. RequestTransferExit
// 代码模式类似download,这里省略详细实现
return result;
}
4. 集成到实际通信通道示例

使用SocketCAN(Linux)的伪代码:

class SocketCANChannel : public DiagnosticChannel {
int sock;
public:
std::vector request(const std::vector& req) override {
// 使用ISO-TP协议封装CAN帧 (需分段发送)
// 接收完整响应,处理流控帧
// ...
return response;
}
};
五、注意事项与最佳实践
  1. 地址和长度格式协商:addressAndLengthFormatIdentifier需与ECU文档严格匹配。不同ECU可能使用2字节地址+2字节长度等。

  2. 块序列计数器:应从0x01开始,循环使用,但传输完成前不应重复。部分ECU对乱序敏感。

  3. 错误处理:处理否定响应码(NRC),常见的有:

  • 0x13:incorrectMessageLength

  • 0x22:conditionsNotCorrect(通常需要先进入编程会话)

  • 0x31:requestOutOfRange(地址或长度超限)

  • 0x70:uploadDownloadNotAccepted

安全访问:大多数ECU要求先通过0x27服务解锁权限,否则返回0x33 securityAccessDenied。

传输中断恢复:如果某次TransferData失败,需要重新发起完整的下载流程(RequestDownload重新开始)。不支持断点续传(除非应用层自定义)。

时序和流控:在CAN上使用ISO-TP时,ECU会通过流控帧控制发送节奏,底层通道必须正确处理。

六、总结

UDS上传下载功能单元(0x34~0x37)为ECU编程和标定提供了标准化的数据块传输机制。理解这四个服务的交互时序及其C++封装,能够帮助开发者快速构建诊断刷写工具。在实际项目中,还需结合具体的传输层(如DoIP、CAN-FD)和安全机制(TLS、SecOC)。通过本文的示例代码,读者可以基于自己的通信框架进行扩展,实现可靠的固件升级和诊断数据采集。

扩展阅读:ISO 14229-1:2020 标准第6章(UploadDownload functional unit)、ISO 15765-2(传输层)

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
弄巧成拙!网传义乌一饭店:客人白酒啤酒饮料连菜都自带,14个人只花430元,包厢还弄得满地垃圾

弄巧成拙!网传义乌一饭店:客人白酒啤酒饮料连菜都自带,14个人只花430元,包厢还弄得满地垃圾

王老师你还好吗
2026-09-28 01:39:54
20名“双一流”大学生、研究生"翻墙"被处分 ,网传被举报:“一个姐们差一名保研,拿翻墙这事把前面所有人全举报了”

20名“双一流”大学生、研究生"翻墙"被处分 ,网传被举报:“一个姐们差一名保研,拿翻墙这事把前面所有人全举报了”

双一流高校
2026-09-28 00:09:38
西贝又上热搜了,不是罗永浩,是俩探店博主线下吃出来的热度。

西贝又上热搜了,不是罗永浩,是俩探店博主线下吃出来的热度。

荆楚寰宇文枢
2026-09-27 20:53:44
单飞后,半价“问界”来了!赛力斯官宣,新车9月28日发布!

单飞后,半价“问界”来了!赛力斯官宣,新车9月28日发布!

电动内参
2026-09-27 18:36:24
英国政府杀人诛心!引用中方判决,拒绝乱港分子入境,蟑螂天塌了

英国政府杀人诛心!引用中方判决,拒绝乱港分子入境,蟑螂天塌了

不甜的李子
2026-09-27 21:44:04
知名投资人曝刘欢真实死因是肝癌!8月底他曾在餐厅吃饭状态不错

知名投资人曝刘欢真实死因是肝癌!8月底他曾在餐厅吃饭状态不错

一个小豹子
2026-09-27 09:40:19
湖南一男子拾荒21年后领得42万养老金:当过国企工人,下岗后一直未缴费以为领不到

湖南一男子拾荒21年后领得42万养老金:当过国企工人,下岗后一直未缴费以为领不到

潇湘晨报
2026-09-27 20:04:27
击中了!俄罗斯国防部宣布重大战果!

击中了!俄罗斯国防部宣布重大战果!

故事终将光明磊落
2026-09-27 10:49:40
理想汽车抽奖送iPhone,“唯一中奖人”是罗永浩!此前刚发文炮轰苹果新款折叠屏,罗永浩最新回应:将以抽奖形式送网友

理想汽车抽奖送iPhone,“唯一中奖人”是罗永浩!此前刚发文炮轰苹果新款折叠屏,罗永浩最新回应:将以抽奖形式送网友

大风新闻
2026-09-27 18:14:18
绝了!唐僧取经先被办证窗口问崩溃,教师资格证采矿证捕捞证一张不能少

绝了!唐僧取经先被办证窗口问崩溃,教师资格证采矿证捕捞证一张不能少

三言四拍
2026-09-27 19:24:04
五十年代究竟杀了多少地主恶霸?难道五六十年代还不如解放前吗?

五十年代究竟杀了多少地主恶霸?难道五六十年代还不如解放前吗?

历史甄有趣
2026-09-27 17:15:19
王曼昱夺冠庆祝!国乒将帅现场保持沉默,王励勤见她俩举起国旗后鼓掌

王曼昱夺冠庆祝!国乒将帅现场保持沉默,王励勤见她俩举起国旗后鼓掌

三十年莱斯特城球迷
2026-09-27 21:53:46
1:4完败!输球不可怕,可怕的是早田希娜赛后这番话,彻底破防!

1:4完败!输球不可怕,可怕的是早田希娜赛后这番话,彻底破防!

田先生篮球
2026-09-27 15:28:28
4-2逆转夺冠!中国男乒21岁王牌崛起:四杀日乒名将+扎心张本智和

4-2逆转夺冠!中国男乒21岁王牌崛起:四杀日乒名将+扎心张本智和

李喜林篮球绝杀
2026-09-27 20:20:04
青年男女疑高铁上不雅举动引热议 女方还有腹肌 网友:肯定练过

青年男女疑高铁上不雅举动引热议 女方还有腹肌 网友:肯定练过

环球趣闻分享
2026-09-27 13:36:44
“45秒,全没了!”柏林宣布退出,奥运会从顶级IP沦为财政噩梦

“45秒,全没了!”柏林宣布退出,奥运会从顶级IP沦为财政噩梦

史智文道
2026-09-27 19:19:01
俞敏洪:如果拼了命,英年早逝的话,和不那么拼命,而活到八九十岁,看世界变化,我认为不那么拼命活八九十岁,是一件更加合算的事

俞敏洪:如果拼了命,英年早逝的话,和不那么拼命,而活到八九十岁,看世界变化,我认为不那么拼命活八九十岁,是一件更加合算的事

品读时刻
2026-09-10 09:07:58
库页岛打出“三绝不”:不属于中国、不像俄罗斯、不承认历史

库页岛打出“三绝不”:不属于中国、不像俄罗斯、不承认历史

纪史行者
2026-09-19 17:40:52
震惊!网传某半导体大厂号召全员降薪共渡难关,一同降薪20%,财报曝光:老总年薪大涨33%,年薪反倒从600万涨至800万

震惊!网传某半导体大厂号召全员降薪共渡难关,一同降薪20%,财报曝光:老总年薪大涨33%,年薪反倒从600万涨至800万

火山詩话
2026-09-27 13:25:11
日媒:严子怡一枪砸穿日本纪录 日本网友:她去参加男子比赛也会赢

日媒:严子怡一枪砸穿日本纪录 日本网友:她去参加男子比赛也会赢

劲爆体坛
2026-09-27 23:15:02
2026-09-28 06:23:00
新能源自动驾驶 incentive-icons
新能源自动驾驶
专注于半导体行业资讯
1015文章数 348关注度
往期回顾 全部

汽车要闻

MAZDA EZ-60激光版上市 焕新全系11.39万元起

头条要闻

教师称成绩排名靠后被强制培训 广西南丹通报调查情况

头条要闻

教师称成绩排名靠后被强制培训 广西南丹通报调查情况

体育要闻

114项指控成立,曼城已经完蛋了吗?

娱乐要闻

刘欢去世后谣言四起,韩磊被翻旧账

财经要闻

“为了看短剧,我妈两年花了22万 ”

科技要闻

星舰第14飞,为什么准备绕地球六圈?

态度原创

本地
数码
健康
艺术
公开课

本地新闻

中秋逛白塔寺,体验国医妙荟雅集

数码要闻

10499元 微星Claw 8 EX AI+上新:搭载Arc G3处理器、睿频可达4.6GHz

鼻子三角区的痘,千万别乱挤!

艺术要闻

致敬,刘欢硬笔书法欣赏

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版