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

诊断服务标识符(SID)概述(0x00–0xFF)

0
分享至


在汽车电子诊断领域(如 UDS、OBD),服务标识符(Service Identifier, SID)是诊断报文的核心字段,用于区分不同的诊断服务或响应类型。SID 占用 1 字节,取值范围 0x00~0xFF。理解 SID 的划分是开发诊断栈、解析诊断报文的基础。

1. 整体地址空间划分

根据 ISO 14229(UDS)、ISO 15031-5(OBD)以及行业惯例,0x00~0xFF 可划分为以下主要区域:

范围

类型

典型协议/说明

0x00 – 0x3E

诊断请求 SID

UDS (ISO 14229-1) 定义的服务请求

0x3F

未应用 / 保留

0x40 – 0x4F

诊断响应 SID

OBD 模式响应(ISO 15031-5)及部分 UDS 正响应

0x50 – 0x7E

UDS 正响应 SID

对应请求 SID + 0x40

0x7F

负响应标识符

否定响应报文(Negative Response)

0x80 – 0xBF

保留 / 制造商自定义

ISO 14229 保留区域,部分供 OEM 使用

0xC0 – 0xFF

制造商特定 / 系统特定

由汽车或系统制造商定义,不属于标准 UDS/OBD 服务


注意:UDS 正响应 SID = 请求 SID + 0x40。例如请求 0x10(DiagnosticSessionControl)的正响应是 0x50。
2. 各区间详细说明 2.1 0x00 – 0x3E:UDS 请求 SID

ISO 14229-1 定义了此区间内的服务,常见的有:

SID(十六进制)

服务名称

0x10

DiagnosticSessionControl

0x11

ECUReset

0x22

ReadDataByIdentifier

0x2E

WriteDataByIdentifier

0x27

SecurityAccess

0x3E

TesterPresent

0x3E(TesterPresent)是实际使用的请求 SID,0x3F未定义。

2.2 0x40 – 0x4F:OBD 响应 & UDS 早期响应

  • 0x40 – 0x4F在 OBD 中对应模式请求的响应。例如 OBD 模式0x01(请求当前动力总成数据)的响应 SID 为0x41。

  • 在 UDS 中,此区间也作为部分正响应使用(如0x44、0x45等,但较少见)。

2.3 0x50 – 0x7E:UDS 正响应 SID

此区间完全对应请求 SID0x10~0x3E的正响应。例如:

  • 0x10请求 →0x50正响应

  • 0x22请求 →0x62正响应

  • 0x3E请求 →0x7E正响应

2.4 0x7F:负响应标识符

当 ECU 无法处理某请求时,返回负响应报文,其第一个字节固定为0x7F,随后是请求的 SID 和负响应码(NRC)。例如:

7F 22 13    → 对 ReadDataByIdentifier (0x22) 的负响应,NRC=0x13(invalidLength)
2.5 0x80 – 0xFF:保留 & 制造商特定
  • 0x80 – 0xBF:ISO 14229 保留为未来使用,部分被 AUTOSAR 或特定 OEM 占用。

  • 0xC0 – 0xFF:完全由制造商自定义,可用于私有诊断服务或扩展功能。

3. C++ 代码举例

以下代码演示如何识别 SID 类型并提供基础解析框架。

#include  

#include

// 服务标识符类型枚举
enum class SidType {
UDS_REQUEST,
OBD_RESPONSE, // 0x40-0x4F 中的 OBD 响应
UDS_POSITIVE_RESPONSE,
NEGATIVE_RESPONSE,
RESERVED,
MANUFACTURER_SPECIFIC
};

// 判断 SID 的类型
SidType getSidType(uint8_t sid) {
if (sid >= 0x00 && sid <= 0x3E)
return SidType::UDS_REQUEST;
else if (sid >= 0x40 && sid <= 0x4F)
return SidType::OBD_RESPONSE; // 也可以统一归为正响应,但 OBD 特殊
else if (sid >= 0x50 && sid <= 0x7E)
return SidType::UDS_POSITIVE_RESPONSE;
else if (sid == 0x7F)
return SidType::NEGATIVE_RESPONSE;
else if (sid >= 0x80 && sid <= 0xBF)
return SidType::RESERVED;
else // 0xC0-0xFF
return SidType::MANUFACTURER_SPECIFIC;
}

// 根据 SID 获得服务名称(仅示例部分常用值)
std::string getServiceName(uint8_t sid, SidType type) {
if (type == SidType::UDS_REQUEST) {
switch (sid) {
case 0x10: return "DiagnosticSessionControl";
case 0x11: return "ECUReset";
case 0x22: return "ReadDataByIdentifier";
case 0x2E: return "WriteDataByIdentifier";
case 0x27: return "SecurityAccess";
case 0x3E: return "TesterPresent";
default: return "Unknown UDS request";
}
}
else if (type == SidType::UDS_POSITIVE_RESPONSE) {
uint8_t reqSid = sid - 0x40;
return "Positive response to request " + std::to_string(reqSid);
}
else if (type == SidType::OBD_RESPONSE) {
uint8_t mode = sid - 0x40;
return "OBD response for mode " + std::to_string(mode);
}
else if (type == SidType::NEGATIVE_RESPONSE) {
return "Negative response identifier";
}
else if (type == SidType::RESERVED) {
return "Reserved (ISO 14229)";
}
else {
return "Manufacturer specific";
}
}

// 解析一条诊断报文(仅针对 SID 部分)
void diagnoseMessage(const uint8_t* msg, size_t len) {
if (len == 0) return;
uint8_t sid = msg[0];
SidType type = getSidType(sid);
std::string name = getServiceName(sid, type);

std::cout << "SID: 0x" << std::hex << std::setw(2) << std::setfill('0') << (int)sid << std::dec;
std::cout << " -> Type: ";
switch (type) {
case SidType::UDS_REQUEST: std::cout << "UDS Request"; break;
case SidType::OBD_RESPONSE: std::cout << "OBD Response"; break;
case SidType::UDS_POSITIVE_RESPONSE: std::cout << "UDS Positive Response"; break;
case SidType::NEGATIVE_RESPONSE: std::cout << "Negative Response"; break;
case SidType::RESERVED: std::cout << "Reserved"; break;
case SidType::MANUFACTURER_SPECIFIC: std::cout << "Manufacturer Specific"; break;
}
std::cout << ", Name: " << name << std::endl;

// 负响应时建议继续解析后续字节(NRC)
if (type == SidType::NEGATIVE_RESPONSE && len >= 3) {
std::cout << " >> Request SID that caused negative: 0x" << std::hex << (int)msg[1] << std::dec;
std::cout << ", NRC: 0x" << std::hex << (int)msg[2] << std::dec << std::endl;
}
}

// 示例测试
int main() {
// 模拟几个诊断报文(仅首字节为 SID)
uint8_t request[] = {0x22, 0xF1, 0x90}; // ReadDataByIdentifier
uint8_t positive[] = {0x62, 0xF1, 0x90, 0x01, 0x02}; // 正响应
uint8_t negative[] = {0x7F, 0x22, 0x13}; // 负响应
uint8_t obdResp[] = {0x41, 0x05, 0x7F}; // OBD mode 1 response
uint8_t vendor[] = {0xE0, 0x01, 0x02}; // 制造商自定义

diagnoseMessage(request, sizeof(request));
diagnoseMessage(positive, sizeof(positive));
diagnoseMessage(negative, sizeof(negative));
diagnoseMessage(obdResp, sizeof(obdResp));
diagnoseMessage(vendor, sizeof(vendor));

return 0;
}

输出示例:

SID: 0x22 -> Type: UDS Request, Name: ReadDataByIdentifier
SID: 0x62 -> Type: UDS Positive Response, Name: Positive response to request 34
SID: 0x7F -> Type: Negative Response, Name: Negative response identifier
>> Request SID that caused negative: 0x22, NRC: 0x13
SID: 0x41 -> Type: OBD Response, Name: OBD response for mode 1
SID: 0xE0 -> Type: Manufacturer Specific, Name: Manufacturer specific
4. 总结
  • 0x00–0x3E:UDS 请求服务,是诊断仪主动发出的指令。

  • 0x40–0x7E:正响应,其中 0x40–0x4F 多为 OBD 响应,0x50–0x7E 为 UDS 正响应。

  • 0x7F:负响应的固定标识,后面跟随原请求 SID 和错误码。

  • 0x80–0xFF:保留或制造商自定义,扩展性强。

掌握 SID 的划分,能帮助开发者快速判断报文方向、解析协议一致性,并编写健壮的车载诊断软件。上述 C++ 代码给出了一个轻量级的 SID 识别器,可嵌入到实际诊断栈或工具链中,根据需求继续补充更多服务名称和解析逻辑。

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

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.

相关推荐
热点推荐
张雪一句“鄙视你”,泰康秒赔8万:他不是突然良心发现,而是突然发现“不要脸的成本”太高了

张雪一句“鄙视你”,泰康秒赔8万:他不是突然良心发现,而是突然发现“不要脸的成本”太高了

迷世书童
2026-09-27 10:52:03
医院老护士含泪揭秘:人临终前的10个残酷真相,很多子女不懂

医院老护士含泪揭秘:人临终前的10个残酷真相,很多子女不懂

蝉吟槐蕊
2026-09-13 18:15:04
25岁女子吐槽河北婆婆做“糊弄饭”,老公不耐烦了:爱吃吃不吃滚

25岁女子吐槽河北婆婆做“糊弄饭”,老公不耐烦了:爱吃吃不吃滚

许三岁
2026-09-28 02:00:08
小布披露绝望输球内幕下周取代吴易昺,王左亚运血案含金量引热议

小布披露绝望输球内幕下周取代吴易昺,王左亚运血案含金量引热议

网球之家
2026-09-28 10:27:54
低价“0公里二手车”连环骗局爆雷,上千车主或面临钱车两空

低价“0公里二手车”连环骗局爆雷,上千车主或面临钱车两空

凤凰网财经
2026-09-27 22:01:48
4次扑救哈兰德+非常规手型!科斯塔9.4分,葡萄牙换代成功了

4次扑救哈兰德+非常规手型!科斯塔9.4分,葡萄牙换代成功了

赵或是个热血青年
2026-09-28 11:28:49
西方不服气,为何中国没发动任何战争,却成为世界一流经济强国

西方不服气,为何中国没发动任何战争,却成为世界一流经济强国

纪史行者
2026-09-28 08:33:10
刘欢临终细节被曝!含泪离世,老婆女儿都守在身旁,母女俩太痛苦

刘欢临终细节被曝!含泪离世,老婆女儿都守在身旁,母女俩太痛苦

观察鉴娱
2026-09-27 10:19:27
张杰谢娜一家五口出游,仨女儿都坐推车不带腿,有专属摄影师摄像

张杰谢娜一家五口出游,仨女儿都坐推车不带腿,有专属摄影师摄像

阿废冷眼观察所
2026-09-28 00:02:06
喜讯!U23国足进入亚运会四强之后,足协就可能跟多位强援完成续约

喜讯!U23国足进入亚运会四强之后,足协就可能跟多位强援完成续约

振刚说足球
2026-09-28 10:05:42
亚运会女单金牌得主诞生!王曼昱4-2险胜孙颖莎,摘得生涯第2冠

亚运会女单金牌得主诞生!王曼昱4-2险胜孙颖莎,摘得生涯第2冠

乒谈
2026-09-27 20:58:07
彻底崩盘!曼联 6000 万水货混日子!名宿怒喷卡里克赶紧清洗

彻底崩盘!曼联 6000 万水货混日子!名宿怒喷卡里克赶紧清洗

澜归序
2026-09-28 09:11:57
人无法共情以前自己买的那些东西。网友:三个垃圾桶1700。

人无法共情以前自己买的那些东西。网友:三个垃圾桶1700。

天气观察站
2026-09-27 16:03:26
气愤!刘翔师弟夺冠后怒斥:日本电视台没把我当回事 日本选手无视我

气愤!刘翔师弟夺冠后怒斥:日本电视台没把我当回事 日本选手无视我

念洲
2026-09-27 20:49:20
李谷一不再隐瞒,揭晓宋祖英走上高位的真相,观众:原来如此!

李谷一不再隐瞒,揭晓宋祖英走上高位的真相,观众:原来如此!

林轻吟
2026-07-02 19:19:19
中秋假期游客在秦皇岛乘坐海上索道被淋成落汤鸡,景区:下雨后暂停了一会索道,淋到雨的游客是在下雨前上去的

中秋假期游客在秦皇岛乘坐海上索道被淋成落汤鸡,景区:下雨后暂停了一会索道,淋到雨的游客是在下雨前上去的

台州交通广播
2026-09-27 19:31:25
一投提前下班!严子怡大幅提升赛会纪录,夺亚运会女子标枪金牌

一投提前下班!严子怡大幅提升赛会纪录,夺亚运会女子标枪金牌

全景体育V
2026-09-27 21:01:43
如果莉莉贝特真长这样!丝毫不输夏洛特公主,皮肤还更白嫩!

如果莉莉贝特真长这样!丝毫不输夏洛特公主,皮肤还更白嫩!

艺利森
2026-09-28 09:07:46
美方同意放行伊朗总统,专机起飞后怕生变故,全程未在第三国停靠

美方同意放行伊朗总统,专机起飞后怕生变故,全程未在第三国停靠

你是我心中最美星空
2026-09-27 20:36:09
案例:湖南女护士被执行死刑,行刑时回头质问武警,让他当场崩溃

案例:湖南女护士被执行死刑,行刑时回头质问武警,让他当场崩溃

星宇共鸣
2025-09-17 17:58:03
2026-09-28 12:08:49
新能源自动驾驶 incentive-icons
新能源自动驾驶
专注于半导体行业资讯
1015文章数 348关注度
往期回顾 全部

汽车要闻

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

头条要闻

媒体:俄杜马选举普京获压倒性胜利 俄乌冲突有2大走向

头条要闻

媒体:俄杜马选举普京获压倒性胜利 俄乌冲突有2大走向

体育要闻

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

娱乐要闻

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

财经要闻

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

科技要闻

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

态度原创

艺术
数码
游戏
健康
房产

艺术要闻

致敬,刘欢硬笔书法欣赏

数码要闻

满电青春集结古都 航嘉满电青年计划9月22日登陆西安电子科技大学

外媒为PlayStation提出五项建议!关注旧作与实体版

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

房产要闻

全年霸榜TOP1!南海・叁號院周年官宣:新作即将登场

无障碍浏览 进入关怀版