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

UDS 服务 0x2E:通过标识符写入数据(WriteDataByIdentifier)详解与 C++ 示例

0
分享至


1. 服务概述

在统一诊断服务(UDS,ISO 14229)中,0x2E 服务(WriteDataByIdentifier)允许外部诊断工具向 ECU(电子控制单元)写入由数据标识符(DID,Data Identifier)指定的单个数据值。典型应用场景包括:

  • 写入车辆 VIN 码(DID 常为0xF190)

  • 设置 ECU 序列号(DID 如0xF18C)

  • 更新软件版本号或标定参数

  • 配置功能选项(如车窗升降比例、灯光延时等)

每个 DID 占 2 字节(16 位),其定义、长度和读写权限由 ECU 制造商在开发阶段确定。部分 DID 允许任意写入,而涉及安全或关键配置的 DID 通常需要先通过0x27 服务(安全访问)解锁权限。

2. 报文格式 2.1 请求报文(诊断工具 → ECU)

字节位置

参数名称

值(例)

0

服务 ID

0x2E

WriteDataByIdentifier

1

DID 高字节

0xF1

数据标识符高位(如 VIN 码标识)

2

DID 低字节

0x90

数据标识符低位

3 … N

数据字节流

0x31 0x32 ...

待写入的原始数据(长度由 DID 定义决定)

示例:向 DID =0xF18C(ECU 序列号)写入 4 字节数据12 34 56 78
2E F1 8C 12 34 56 78

2.2 肯定响应(ECU → 诊断工具)

字节位置

参数名称

值(例)

0

服务 ID

0x6E

请求服务 ID + 0x40(肯定)

1

DID 高字节

0xF1

原请求中的 DID 高位

2

DID 低字节

0x8C

原请求中的 DID 低位

示例:对上例的肯定响应
6E F1 8C

2.3 否定响应(ECU → 诊断工具)

若 ECU 无法执行写入,返回以下格式:

字节位置

参数名称

值(例)

0

否定响应 ID

0x7F

固定值

1

请求服务 ID

0x2E

被拒绝的服务

2

否定响应码

0xXX

NRC(见下文常见代码)

常用否定响应码(NRC):

  • 0x13:报文长度无效(数据长度与 DID 定义不匹配)

  • 0x31:请求超出范围(DID 不存在或当前会话不支持)

  • 0x33:安全访问被拒绝(未解锁写入权限)

  • 0x72:一般编程失败(写入存储时硬件错误)

3. C++ 代码举例:ECU 端处理 0x2E 服务

以下代码模拟了一个简单 ECU,它维护内部 DID 存储表、写入权限映射,并实现了0x2E服务的完整处理流程(含长度校验、权限检查、否定响应生成)。

#include  

#include
#include
#include

// 模拟 ECU 内部存储
class EcuSimulator {
public:
EcuSimulator() {
// 初始化预定义的 DID 及其数据长度、写入权限
// VIN 码 (17 字节,假设初始全为 '?')
dataStore[0xF190] = std::vector(17, '?');
writePerm[0xF190] = true;

// ECU 序列号 (4 字节)
dataStore[0xF18C] = {0x00, 0x00, 0x00, 0x00};
writePerm[0xF18C] = true;

// 只读 DID (2 字节,例如硬件版本)
dataStore[0xF123] = {0x01, 0x02};
writePerm[0xF123] = false;
}

// 处理完整 UDS 请求(假设已剥离掉地址信息等,只保留 UDS 报文)
// 输入:完整 UDS 请求报文(包含服务 ID)
// 输出:响应报文(肯定或否定)
std::vector processRequest(const std::vector& request) {
if (request.empty()) {
return buildNegativeResponse(0x2E, 0x13); // 无效长度
}

uint8_t serviceId = request[0];
if (serviceId == 0x2E) {
// 提取 DID + 数据部分(服务 ID 之后)
std::vector payload(request.begin() + 1, request.end());
return handleWriteDataByIdentifier(payload);
}
// 其他服务忽略,返回不支持
return buildNegativeResponse(serviceId, 0x11);
}

private:
// DID 存储表:DID -> 数据字节数组
std::unordered_map> dataStore;
// 写入权限表:DID -> 是否允许写入
std::unordered_map writePerm;

// 构造否定响应
std::vector buildNegativeResponse(uint8_t reqServiceId, uint8_t nrc) {
return {0x7F, reqServiceId, nrc};
}

// 核心处理函数:处理 WriteDataByIdentifier (0x2E) 服务
// 输入:payload = DID_High + DID_Low + Data
std::vector handleWriteDataByIdentifier(const std::vector& payload) {
// 最小长度:至少包含 DID (2 字节)
if (payload.size() < 2) {
return buildNegativeResponse(0x2E, 0x13); // 报文长度无效
}

// 解析 DID
uint16_t did = (payload[0] << 8) | payload[1];
// 提取待写入的数据(DID 之后的所有字节)
std::vector writeData(payload.begin() + 2, payload.end());

// 1. 检查 DID 是否存在
auto it = dataStore.find(did);
if (it == dataStore.end()) {
return buildNegativeResponse(0x2E, 0x31); // 请求超出范围
}

// 2. 检查写入权限
if (!writePerm[did]) {
return buildNegativeResponse(0x2E, 0x33); // 安全访问被拒绝
}

// 3. 检查写入数据的长度是否与定义长度匹配
if (writeData.size() != it->second.size()) {
return buildNegativeResponse(0x2E, 0x13); // 长度错误
}

// 4. 执行写入操作(这里简单替换,实际可能涉及 EEPROM 写入等)
it->second = writeData;

// 5. 返回肯定响应:0x6E + DID
return {0x6E, payload[0], payload[1]};
}
};

// ---------- 示例使用 ----------
int main() {
EcuSimulator ecu;

// 场景1:向 DID 0xF18C(序列号)写入 4 字节有效数据
std::vector request1 = {0x2E, 0xF1, 0x8C, 0x12, 0x34, 0x56, 0x78};
auto response1 = ecu.processRequest(request1);
std::cout << "Response 1: ";
for (auto b : response1) printf("%02X ", b);
// 预期输出:6E F1 8C
printf("\n");

// 场景2:向只读 DID 0xF123 写入数据(应被拒绝)
std::vector request2 = {0x2E, 0xF1, 0x23, 0xAA, 0xBB};
auto response2 = ecu.processRequest(request2);
std::cout << "Response 2: ";
for (auto b : response2) printf("%02X ", b);
// 预期输出:7F 2E 33
printf("\n");

// 场景3:向存在的 DID 写入错误长度的数据(VIN 需要 17 字节,这里只给 2 字节)
std::vector request3 = {0x2E, 0xF1, 0x90, 0x31, 0x32};
auto response3 = ecu.processRequest(request3);
std::cout << "Response 3: ";
for (auto b : response3) printf("%02X ", b);
// 预期输出:7F 2E 13
printf("\n");

return 0;
}
4. 代码说明与扩展建议
  • 存储模型:实际 ECU 中,DID 数据可能分布在 RAM、EEPROM 或 Flash 中。写入操作可能需要调用底层驱动(如writeFlash()),本示例简化为主内存副本替换。

  • 权限管理:写入权限通常依赖安全访问服务(0x27)。可在处理 0x2E 前检查一个全局安全标志位,若未解锁则返回 NRC0x33。

  • 数据校验:某些 DID 要求数据满足特定范围或格式(如 VIN 需符合 ASCII 规范),可在写入前增加业务校验函数。

  • 多会话支持:UDS 具有不同会话模式(默认会话、扩展会话等)。可增加当前会话状态,限制部分 DID 仅在高权限会话下可写。

  • 事件触发:写入敏感数据后,ECU 可能需要重新初始化相关模块或触发复位。可根据 DID 添加回调机制。

5. 总结

UDS 0x2E 服务为外部工具提供了安全、标准化的 ECU 数据写入能力。开发者需要:

  • 明确定义每个 DID 的数据长度、类型和权限

  • 处理长度不符、DID 不存在、无权限等异常情况并返回规范 NRC

  • 在写入关键数据时配合安全访问机制

上述 C++ 示例展示了服务端处理的核心逻辑,可在此基础上扩展为完整的生产级 UDS 栈模块。

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

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.

相关推荐
热点推荐
俄罗斯总统普京公开表示:爱沙尼亚防长声称要进攻俄罗斯,纯属胡说八道,马戏团走了,小丑留下了,爱沙尼亚全国人口还没俄军人数多

俄罗斯总统普京公开表示:爱沙尼亚防长声称要进攻俄罗斯,纯属胡说八道,马戏团走了,小丑留下了,爱沙尼亚全国人口还没俄军人数多

吉刻新闻
2026-09-28 12:32:49
刘青云携妻子郭蔼明现身卡定沟游玩,模样越来越像萨达姆,一个黑脸一个笑脸对比鲜明

刘青云携妻子郭蔼明现身卡定沟游玩,模样越来越像萨达姆,一个黑脸一个笑脸对比鲜明

裕丰娱间说
2026-09-27 13:57:53
涉案金额过亿 刘应成(原法名释永信)一审被判有期徒刑24年

涉案金额过亿 刘应成(原法名释永信)一审被判有期徒刑24年

每日经济新闻
2026-05-30 00:42:59
权贵们绕开高考走捷径:北理工裴轶和协会 4+4 一个路数

权贵们绕开高考走捷径:北理工裴轶和协会 4+4 一个路数

放开他让wo来
2026-09-27 13:45:46
亚运会最新奖牌榜:日本157枚,韩国83枚,中国健儿太让国人自豪

亚运会最新奖牌榜:日本157枚,韩国83枚,中国健儿太让国人自豪

锅锅爱历史
2026-09-28 06:23:47
被质疑放水输球!混双丢冠,孙颖莎王楚钦开心互动,谁注意王楚钦表态

被质疑放水输球!混双丢冠,孙颖莎王楚钦开心互动,谁注意王楚钦表态

懂球社
2026-09-27 11:25:19
日本:引进中国人,韩国人,甚至越南人都可以,但绝对不引进印度人和穆斯林!

日本:引进中国人,韩国人,甚至越南人都可以,但绝对不引进印度人和穆斯林!

步论天下事
2026-09-28 10:50:23
“没想到一枪就‘下班’了”,18岁严子怡只投了一枪,拿下金牌,大比分碾压日本名将!她曾放话:未来,开启一个属于我的新时代吧

“没想到一枪就‘下班’了”,18岁严子怡只投了一枪,拿下金牌,大比分碾压日本名将!她曾放话:未来,开启一个属于我的新时代吧

南方都市报
2026-09-28 11:58:41
天彻底塌了!亚运全线溃败零金收官,中国篮球已跌至谷底!

天彻底塌了!亚运全线溃败零金收官,中国篮球已跌至谷底!

田先生篮球
2026-09-25 17:24:52
女友在亚马尔社媒评论:我还是觉得你也太帅了,太不真实了

女友在亚马尔社媒评论:我还是觉得你也太帅了,太不真实了

懂球帝
2026-09-27 21:29:20
金卡戴珊全家逛上海野生动物园,紧身裤配高跟鞋,这打扮真够精致

金卡戴珊全家逛上海野生动物园,紧身裤配高跟鞋,这打扮真够精致

悦君兮君不知
2026-09-28 11:21:46
三毛说我去非洲是为了帮助黑人,李敖反问:你为什么不帮助黄人?

三毛说我去非洲是为了帮助黑人,李敖反问:你为什么不帮助黄人?

言过于诚
2026-09-27 22:31:29
骗走50亿!用小鲜肉的血抗衰,被央视曝光的“捞金女王”,真栽了

骗走50亿!用小鲜肉的血抗衰,被央视曝光的“捞金女王”,真栽了

深析古今
2026-04-08 10:09:38
张本智和:阿拉米扬以往发球就算不上完全合规,现在又肆无忌惮

张本智和:阿拉米扬以往发球就算不上完全合规,现在又肆无忌惮

懂球帝
2026-09-27 15:40:00
“反华妖女”许可馨,回国后曾叫嚣没人敢动她,六年后下场如何?

“反华妖女”许可馨,回国后曾叫嚣没人敢动她,六年后下场如何?

锅锅爱历史
2026-07-26 08:50:12
你做过最龌龊,最下流的事是什么?

你做过最龌龊,最下流的事是什么?

那年秋天
2026-08-16 11:50:09
仔细看,这张拍于2016年的合影照,当时樊振东19岁,那时的樊振东确实还满是青涩感!就不知左边的美女是谁?

仔细看,这张拍于2016年的合影照,当时樊振东19岁,那时的樊振东确实还满是青涩感!就不知左边的美女是谁?

小琦聊生活
2026-09-25 13:24:02
《繁花》里最狠的一条生意经:嘴甜是下等人的本事,忠心是中等人的筹码,能被大人物拉上桌的分蛋糕者,手里攥着这两种教人离不开的硬通货

《繁花》里最狠的一条生意经:嘴甜是下等人的本事,忠心是中等人的筹码,能被大人物拉上桌的分蛋糕者,手里攥着这两种教人离不开的硬通货

心理观察局
2026-08-04 06:38:04
河南一技校101名毕业生入职北大,所涉专业系全国唯一,该校曾入职北大的毕业生:有和北大人才中心签约的,也有劳务派遣

河南一技校101名毕业生入职北大,所涉专业系全国唯一,该校曾入职北大的毕业生:有和北大人才中心签约的,也有劳务派遣

极目新闻
2026-09-27 19:00:11
微信上基本不发朋友圈的人,未必低调,十有八九是这三种人:1、生活过于丰富,不便展示;2、看透人性,藏锋守拙;3、自给自足,太充实

微信上基本不发朋友圈的人,未必低调,十有八九是这三种人:1、生活过于丰富,不便展示;2、看透人性,藏锋守拙;3、自给自足,太充实

品读时刻
2026-09-12 09:06:58
2026-09-28 13:11:00
新能源自动驾驶 incentive-icons
新能源自动驾驶
专注于半导体行业资讯
1015文章数 348关注度
往期回顾 全部

科技要闻

智能体惹了多少祸,OpenAI自己没查清!

头条要闻

供销社职工以46600元参与拐卖外籍妇女 获刑5年9个月

头条要闻

供销社职工以46600元参与拐卖外籍妇女 获刑5年9个月

体育要闻

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

娱乐要闻

好汉刘欢:一副好嗓子,一颗赤子心

财经要闻

标价298元核桃油, 实为大豆油冒充

汽车要闻

神龙科技与Momenta达成全球战略合作 2027年起推新车

态度原创

家居
亲子
时尚
游戏
旅游

家居要闻

2026建博会(广州) 公装联探展交流活动

亲子要闻

世界上最危险的十大玩具,为何成为了可怕的伤人利器?

女人过了三四十岁,一定要准备一件小西装,大方得体又显瘦

《堡垒之夜》2026全球赛冠军出炉,获40万美元奖金

旅游要闻

广州南沙中秋接待游客超104万人次,多元演艺点燃文旅消费

无障碍浏览 进入关怀版