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

诊断服务标识符(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.

相关推荐
热点推荐
教育部原党组成员、副部长鲁昕被查

教育部原党组成员、副部长鲁昕被查

都市快报橙柿互动
2026-09-28 10:17:29
广东一租客因欠租搬走后,13岁男孩被独留停水停电出租屋不上学:母亲拒绝帮助,父亲电话停机;房东急了

广东一租客因欠租搬走后,13岁男孩被独留停水停电出租屋不上学:母亲拒绝帮助,父亲电话停机;房东急了

扬子晚报
2026-09-28 10:28:50
耿同学又出手!揭《Nature》一论文造假,24个原始值完全一致,通讯作者已承认并撤稿

耿同学又出手!揭《Nature》一论文造假,24个原始值完全一致,通讯作者已承认并撤稿

材料科学与工程
2026-09-24 11:48:39
女子千里赴约让情人白睡,2016年情夫和她缠绵完很满足,将她杀死并抛尸

女子千里赴约让情人白睡,2016年情夫和她缠绵完很满足,将她杀死并抛尸

汉史趣闻
2026-09-26 09:25:49
亚运会:世界第1爆冷出局!冯彦哲/黄东萍0-2印尼混双,5连胜终结

亚运会:世界第1爆冷出局!冯彦哲/黄东萍0-2印尼混双,5连胜终结

钉钉陌上花开
2026-09-28 09:13:11
主张联俄抗中的专家叛变了!去俄罗斯待了7天,回来就换了说法

主张联俄抗中的专家叛变了!去俄罗斯待了7天,回来就换了说法

游文刀
2026-09-24 21:18:36
这跟不穿有啥区别?三角区明显,41岁女星穿透视3D打印裙惹争议

这跟不穿有啥区别?三角区明显,41岁女星穿透视3D打印裙惹争议

铁锤妹妹是只猫
2026-09-26 19:04:43
西贝又上热搜了,不是罗永浩,是俩探店博主线下吃出来的热度。

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

荆楚寰宇文枢
2026-09-27 20:53:44
再看刘欢的从头再来:为什么是普通工人而不是干部和领导?

再看刘欢的从头再来:为什么是普通工人而不是干部和领导?

阿废冷眼观察所
2026-09-27 16:01:39
塞尔维亚总统武契奇宣布辞职

塞尔维亚总统武契奇宣布辞职

澎湃新闻
2026-09-28 02:47:02
知名投资人曝刘欢真实死因是肝癌!8月底他曾在餐厅吃饭状态不错

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

一个小豹子
2026-09-27 09:40:19
绝了!唐僧取经先被办证窗口问崩溃,教师资格证采矿证捕捞证一张不能少

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

三言四拍
2026-09-27 19:24:04
王祉怡0-2不敌山口茜无缘亚运会女单决赛,收获铜牌

王祉怡0-2不敌山口茜无缘亚运会女单决赛,收获铜牌

懂球帝
2026-09-28 12:12:06
创业板指跌逾2%,全市场下跌个股超4200只

创业板指跌逾2%,全市场下跌个股超4200只

界面新闻
2026-09-28 09:39:39
七连斩世界第5!刘圣书/谭宁2-1逆转大马王牌,剑指亚运女双首冠

七连斩世界第5!刘圣书/谭宁2-1逆转大马王牌,剑指亚运女双首冠

钉钉陌上花开
2026-09-28 10:06:57
伊朗总统当着美媒面诉苦:石油卖给中国,钱却卡在账户里

伊朗总统当着美媒面诉苦:石油卖给中国,钱却卡在账户里

共工之锚
2026-09-28 00:20:41
C罗暴怒原因揭晓!约好出战半小时却变卦 72岁新帅:他不该拒绝谢场

C罗暴怒原因揭晓!约好出战半小时却变卦 72岁新帅:他不该拒绝谢场

我爱英超
2026-09-28 07:14:39
陈圆将造世界名画:夺金后霸气庆祝 赛前无视他的日本选手绝望跪地

陈圆将造世界名画:夺金后霸气庆祝 赛前无视他的日本选手绝望跪地

风过乡
2026-09-28 07:37:22
穆里尼奥狂喜!皇马天降超级喜讯!巴萨这下要慌了

穆里尼奥狂喜!皇马天降超级喜讯!巴萨这下要慌了

澜归序
2026-09-28 08:25:24
李克勤演唱会迟到,救场歌手连唱近20首,本人表示:“3万人的演出这还是第一次,之前最多是五六千人”

李克勤演唱会迟到,救场歌手连唱近20首,本人表示:“3万人的演出这还是第一次,之前最多是五六千人”

韩小娱
2026-09-27 16:58:06
2026-09-28 12:36:49
新能源自动驾驶 incentive-icons
新能源自动驾驶
专注于半导体行业资讯
1015文章数 348关注度
往期回顾 全部

汽车要闻

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

头条要闻

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

头条要闻

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

体育要闻

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

娱乐要闻

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

财经要闻

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

科技要闻

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

态度原创

旅游
手机
房产
本地
公开课

旅游要闻

全球首个具身智能主题乐园落地横琴长隆——以“科技+文旅”深度融合助力新质生产力发展

手机要闻

手机芯片追平桌面显卡!A20 Pro跑3A持平GTX 1650:能效比1180%碾压

房产要闻

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

本地新闻

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

公开课

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

无障碍浏览 进入关怀版