无主之地2配置高吗|看真人裸体BBBBB|秋草莓丝瓜黄瓜榴莲色多多|真人強奷112分钟|精品一卡2卡3卡四卡新区|日本成人深夜苍井空|八十年代动画片

網易首頁 > 網易號 > 正文 申請入駐

UDS診斷服務淺析:DTC相關服務(0x19/0x14)以及代碼實現

0
分享至


一、服務概述

在UDS(Unified Diagnostic Services)協議中,診斷故障碼(DTC)的管理是核心功能之一。本文介紹兩個關鍵服務:

服務

SID

功能描述

ReadDTCInformation

0x19

從ECU讀取DTC及其詳細信息(狀態、快照、擴展記錄)

ClearDiagnosticInformation

0x14

清除ECU中存儲的DTC及相關診斷信息

這兩個服務互為逆過程,共同完成故障信息的讀取與清除功能。

二、DTC數據結構詳解 2.1 三字節DTC組成

UDS中的DTC采用3字節存儲,結構如下:

+------------------+------------------+------------------+
| Byte 1 | Byte 2 | Byte 3 |
| (Root DTC高) | (Root DTC低) | FTB |
+------------------+------------------+------------------+
2.2 Root DTC解析(Byte1-2)

Byte1的位域含義:

Bit位

含義

編碼規則

bit7-6

故障所屬系統

00=P(動力), 01=C(底盤), 10=B(車身), 11=U(網絡)

bit5-4

故障碼類型

00=ISO/SAE標準, 01=制造商自定義, 10=ISO/SAE保留

bit3-0

故障子系統

見詳細定義表

示例解析:DTC = 0x0123

Byte1: 0x01 = 0000 0001
├─ bit7-6 = 00 → P (動力系統)
├─ bit5-4 = 00 → 標準故障碼
└─ bit3-0 = 0001 → 燃油或空氣系統
Byte2: 0x23 → 節氣門/踏板位置傳感器電路
結果: P0123 - 節氣門/踏板位置傳感器電路A高輸入
2.3 FTB(Failure Type Byte)解析(Byte3)

FTB用于精確描述故障的具體模式:

FTB值

故障類型

FTB值

故障類型

0x01

信號偏低

0x11

更新錯誤

0x02

信號偏高

0x12

編碼錯誤

0x03

信號不穩定

0x13

校準錯誤

0x04

信號中斷

0x17

電壓低于閾值

0x05

信號短路

0x18

電壓高于閾值

0x06

接地短路

0x21

信號卡滯

完整示例:DTC = 0x012317

三字節DTC: 0x01 0x23 0x17
├─ Byte1(0x01): P(動力系統) + 標準故障碼 + 燃油/空氣系統
├─ Byte2(0x23): 節氣門/踏板位置傳感器電路
└─ Byte3(0x17): 電壓低于閾值


完整解讀:P0123 - 節氣門/踏板位置傳感器電路A輸入高,故障模式為電壓低于閾值
三、DTC狀態掩碼(DTCStatusMask)

狀態掩碼用于篩選特定狀態的DTC,占用1字節,每個bit代表一種故障狀態:

+-------+-------+-------+-------+-------+-------+-------+-------+
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
| test | test | test | test | conf- | pending| mat- | test |
|Failed |Failed |Failed |Failed |irmed |DTC |uration|Failed |
|ThisOp |ThisOp |ThisOp |ThisOp |DTC | | | |
|Cycle |Cycle |Cycle |Cycle | | | | |
+-------+-------+-------+-------+-------+-------+-------+-------+
常用掩碼組合

掩碼值

含義

應用場景

0x09 (bit0+bit3)

當前故障(確認且當前存在)

讀取當前活動故障

0x08 (bit3)

歷史故障(已確認的故障)

讀取歷史故障記錄

0xFF

所有故障

讀取全部故障


四、0x19服務(讀取DTC信息) 4.1 服務格式概述

請求: 0x19 + SubFunction + [參數]
響應: 0x59 + SubFunction + [響應數據]
4.2 子功能01H - 獲取DTC數量

功能:根據掩碼統計符合條件的DTC數量

請求格式: 19 01 [DTCStatusMask]
響應格式: 59 01 [DTCStatusAvailabilityMask] [DTCFormatIdentifier] [DTCCount(高字節)] [DTCCount(低字節)]

字段說明

  • DTCStatusAvailabilityMask:ECU支持的DTC狀態位

  • DTCFormatIdentifier:DTC格式標識符(0x00=SAE_J2012, 0x01=ISO_14229-1, 0x02=SAE_J1939)

  • DTCCount:符合條件的DTC數量(2字節)

示例

請求: 19 01 09        // 統計當前活動故障數量
響應: 59 01 09 01 00 03 // 3個當前故障
4.3 子功能02H - 讀取DTC列表及狀態

功能:讀取符合條件的完整DTC列表及其狀態

請求格式: 19 02 [DTCStatusMask]
響應格式: 59 02 [DTCStatusAvailabilityMask] [DTC1_H] [DTC1_M] [DTC1_L] [Status1] [DTC2...] ...

示例

請求: 19 02 09        // 讀取所有當前故障
響應: 59 02 09
01 23 45 09 // DTC1=0x012345, Status=0x09
01 23 46 09 // DTC2=0x012346, Status=0x09
4.4 子功能03H/04H - 讀取快照數據

快照數據(凍結幀)是故障發生時刻ECU記錄的環境數據。

步驟1 - 03H:獲取快照記錄編號(SRN)

請求: 19 03 [DTC_H] [DTC_M] [DTC_L]
響應: 59 03 [DTC_H] [DTC_M] [DTC_L] [SRN1] [SRN2] ...

步驟2 - 04H:讀取快照數據

請求: 19 04 [DTC_H] [DTC_M] [DTC_L] [SRN]
響應: 59 04 [DTC_H] [DTC_M] [DTC_L] [Status] [SRN] [DID1] [Data1] [DID2] [Data2]...

示例

// 步驟1:獲取0x012345的快照記錄編號
請求: 19 03 01 23 45
響應: 59 03 01 23 45 01 02 // SRN=0x01, 0x02


// 步驟2:讀取SRN=0x01的快照數據
請求: 19 04 01 23 45 01
響應: 59 04 01 23 45 09 01 0x1000 0xABCD 0x1001 0x00C8
// 解讀:狀態0x09, SRN=0x01, DID=0x1000數據=0xABCD, DID=0x1001數據=0x00C8(車速200km/h)
4.5 子功能0AH - 讀取所有支持的DTC

請求格式: 19 0A
響應格式: 59 0A [DTCStatusAvailabilityMask] [DTC1] [Status1] [DTC2] [Status2]...
五、0x14服務(清除DTC) 5.1 服務格式

請求格式: 14 [FF] [FF] [FF]    // 清除所有DTC
響應格式: 54 // 肯定響應
5.2 清除范圍

清除0x14服務時,ECU應清除:

  • 所有已存儲的DTC

  • 所有快照數據(凍結幀)

  • 所有擴展記錄數據

  • 其他與DTC相關的診斷信息

5.3 否定響應碼

NRC

含義

觸發條件

0x13

請求報文長度錯誤

報文長度與協議不匹配

0x31

請求超出范圍

請求了非0xFFFFFF之外的DTC范圍

0x33

安全訪問未解鎖

ECU需要解鎖才能清除DTC


六、C++代碼實現 6.1 DTC數據結構定義

#include  
          
#include
#include
#include
#include
#include

// DTC狀態位枚舉
enum class DTCStatus : uint8_t {
TestFailed = 0x01, // bit0: 最近測試失敗
TestFailedThisOperationCycle = 0x02, // bit1: 本次操作周期測試失敗
PendingDTC = 0x04, // bit2: 待確認DTC
ConfirmedDTC = 0x08, // bit3: 已確認DTC
TestNotCompletedSinceLastClear = 0x10, // bit4: 自上次清除后測試未完成
TestFailedSinceLastClear = 0x20, // bit5: 自上次清除后測試失敗
TestNotCompletedThisOperationCycle = 0x40, // bit6: 本次操作周期測試未完成
WarningIndicatorRequested = 0x80 // bit7: 警告指示請求
};

inline DTCStatus operator|(DTCStatus a, DTCStatus b) {
return static_cast ( static_cast(a) | static_cast(b));
}

inline bool operator&(DTCStatus a, DTCStatus b) {
return (static_cast(a) & static_cast(b)) != 0;
}

// DTC結構體
struct DTC {
uint8_t byte1; // 高字節(系統+類型+子系統)
uint8_t byte2; // 中間字節(具體故障位置)
uint8_t ftb; // 故障類型字節
uint8_t status; // DTC狀態
DTC() : byte1(0), byte2(0), ftb(0), status(0) {}
DTC(uint8_t b1, uint8_t b2, uint8_t f, uint8_t s = 0)
: byte1(b1), byte2(b2), ftb(f), status(s) {}
// 獲取完整DTC碼(3字節)
uint32_t getCode() const {
return (static_cast(byte1) << 16) |
(static_cast(byte2) << 8) |
static_cast(ftb);
}
// 獲取Root DTC(前2字節)
uint16_t getRootDTC() const {
return (static_cast(byte1) << 8) | static_cast(byte2);
}
// 解析故障系統(P/C/B/U)
char getSystem() const {
uint8_t sys = (byte1 >> 6) & 0x03;
switch(sys) {
case 0: return 'P'; // Powertrain
case 1: return 'C'; // Chassis
case 2: return 'B'; // Body
case 3: return 'U'; // Network
default: return '?';
}
}
// 是否為標準故障碼
bool isStandard() const {
return ((byte1 >> 4) & 0x03) == 0;
}
// 獲取故障子系統
uint8_t getSubsystem() const {
return byte1 & 0x0F;
}
// 獲取故障模式描述
std::string getFailureMode() const {
static const std::map modes = {
{0x01, "信號偏低"},
{0x02, "信號偏高"},
{0x03, "信號不穩定"},
{0x04, "信號中斷"},
{0x05, "信號短路"},
{0x06, "接地短路"},
{0x11, "更新錯誤"},
{0x12, "編碼錯誤"},
{0x13, "校準錯誤"},
{0x17, "電壓低于閾值"},
{0x18, "電壓高于閾值"},
{0x21, "信號卡滯"}
};
auto it = modes.find(ftb);
return it != modes.end() ? it->second : "未知故障模式";
}
std::string toString() const {
std::stringstream ss;
ss << getSystem() << std::hex << std::setw(3) << std::setfill('0')
<< (getRootDTC() & 0xFFF) << " - " << getFailureMode()
<< " [Status: 0x" << std::hex << static_cast(status) << "]";
return ss.str();
}
};

// 快照數據項
struct SnapshotData {
uint16_t did; // 數據標識符
std::vector data; // 數據值
};

// 凍結幀數據
struct FreezeFrame {
uint8_t srn; // 快照記錄編號
uint8_t dtcStatus; // DTC狀態
std::map> snapshotData; // DID->數據
};
6.2 DTC管理器類實現

class DTCEcuSimulator {
private:
std::vector storedDTCs; // 已存儲的DTC列表
std::map> snapshotRecords; // DTC碼->SRN列表
std::map> freezeFrames; // DTC->SRN->凍結幀
bool securityAccessGranted; // 安全訪問狀態
public:
DTCEcuSimulator() : securityAccessGranted(false) {}
// 獲取ECU支持的DTC狀態位掩碼
uint8_t getSupportedStatusMask() const {
return 0xFF; // 支持所有狀態位
}
// 檢查DTC是否匹配給定的狀態掩碼
bool isDTCStatusMatch(uint8_t dtcStatus, uint8_t statusMask) const {
return (dtcStatus & statusMask) != 0;
}
/**
* 0x19 01 - 獲取DTC數量
* @param statusMask 狀態掩碼
* @return 響應數據
*/
std::vector handleReadDTCCount(uint8_t statusMask) {
std::vector response;
response.push_back(0x59); // 肯定響應SID
response.push_back(0x01); // 子功能
// DTC狀態可用性掩碼
response.push_back(getSupportedStatusMask());
// DTC格式標識符 (ISO 14229-1格式)
response.push_back(0x01);
// 統計符合條件的DTC數量
uint16_t count = 0;
for (const auto& dtc : storedDTCs) {
if (isDTCStatusMatch(dtc.status, statusMask)) {
count++;
}
}
response.push_back(static_cast((count >> 8) & 0xFF));
response.push_back(static_cast(count & 0xFF));
return response;
}
/**
* 0x19 02 - 讀取DTC列表
* @param statusMask 狀態掩碼
* @return 響應數據
*/
std::vector handleReadDTCList(uint8_t statusMask) {
std::vector response;
response.push_back(0x59);
response.push_back(0x02);
response.push_back(getSupportedStatusMask());
for (const auto& dtc : storedDTCs) {
if (isDTCStatusMatch(dtc.status, statusMask)) {
response.push_back(dtc.byte1);
response.push_back(dtc.byte2);
response.push_back(dtc.ftb);
response.push_back(dtc.status);
}
}
return response;
}
/**
* 0x19 03 - 獲取快照記錄編號
* @param dtcCode 三字節DTC碼
* @return 響應或否定響應碼
*/
std::vector handleGetSnapshotRecordNumbers(uint32_t dtcCode) {
std::vector response;
auto it = snapshotRecords.find(dtcCode);
if (it == snapshotRecords.end()) {
// DTC不存在,返回NRC
response.push_back(0x7F);
response.push_back(0x19);
response.push_back(0x31); // 請求超出范圍
return response;
}
response.push_back(0x59);
response.push_back(0x03);
// 輸出DTC(3字節)
response.push_back(static_cast((dtcCode >> 16) & 0xFF));
response.push_back(static_cast((dtcCode >> 8) & 0xFF));
response.push_back(static_cast(dtcCode & 0xFF));
// 返回所有SRN
for (uint8_t srn : it->second) {
response.push_back(srn);
}
return response;
}
/**
* 0x19 04 - 讀取快照數據
* @param dtcCode DTC碼
* @param srn 快照記錄編號
* @return 響應數據
*/
std::vector handleReadSnapshotData(uint32_t dtcCode, uint8_t srn) {
std::vector response;
// 檢查DTC是否存在
auto dtcIt = freezeFrames.find(dtcCode);
if (dtcIt == freezeFrames.end()) {
response.push_back(0x7F);
response.push_back(0x19);
response.push_back(0x31);
return response;
}
// 檢查SRN是否存在
auto srnIt = dtcIt->second.find(srn);
if (srnIt == dtcIt->second.end()) {
response.push_back(0x7F);
response.push_back(0x19);
response.push_back(0x31);
return response;
}
const FreezeFrame& ff = srnIt->second;
response.push_back(0x59);
response.push_back(0x04);
// 輸出DTC
response.push_back(static_cast((dtcCode >> 16) & 0xFF));
response.push_back(static_cast((dtcCode >> 8) & 0xFF));
response.push_back(static_cast(dtcCode & 0xFF));
// 輸出狀態和SRN
response.push_back(ff.dtcStatus);
response.push_back(srn);
// 輸出快照數據(DID + 數據)
for (const auto& [did, data] : ff.snapshotData) {
response.push_back(static_cast((did >> 8) & 0xFF));
response.push_back(static_cast(did & 0xFF));
response.insert(response.end(), data.begin(), data.end());
}
return response;
}
/**
* 0x19 0A - 讀取所有支持的DTC
* @return 響應數據
*/
std::vector handleReadSupportedDTCs() {
std::vector response;
response.push_back(0x59);
response.push_back(0x0A);
response.push_back(getSupportedStatusMask());
// 這里返回所有可能的DTC(包括未發生的)
// 實際應用中會從DTC數據庫讀取
for (const auto& dtc : storedDTCs) {
response.push_back(dtc.byte1);
response.push_back(dtc.byte2);
response.push_back(dtc.ftb);
response.push_back(dtc.status);
}
return response;
}
/**
* 0x14 - 清除診斷信息
* @param data 請求數據(應包含0xFF FF FF表示清除所有)
* @return 響應或否定響應碼
*/
std::vector handleClearDiagnosticInfo(const std::vector& data) {
std::vector response;
// 檢查安全訪問
if (!securityAccessGranted) {
response.push_back(0x7F);
response.push_back(0x14);
response.push_back(0x33); // 需要安全訪問
return response;
}
// 檢查請求數據長度
if (data.size() != 3 || data[0] != 0xFF || data[1] != 0xFF || data[2] != 0xFF) {
response.push_back(0x7F);
response.push_back(0x14);
response.push_back(0x13); // 報文長度錯誤
return response;
}
// 清除所有診斷信息
storedDTCs.clear();
snapshotRecords.clear();
freezeFrames.clear();
// 肯定響應
response.push_back(0x54);
return response;
}
// 模擬DTC發生(用于測試)
void simulateDTC(const DTC& dtc, uint16_t engineSpeed = 0, uint16_t vehicleSpeed = 0) {
// 檢查是否已存在
for (auto& existing : storedDTCs) {
if (existing.byte1 == dtc.byte1 && existing.byte2 == dtc.byte2 && existing.ftb == dtc.ftb) {
// 更新狀態,添加Confirmed標志
existing.status |= static_cast(DTCStatus::ConfirmedDTC);
return;
}
}
// 存儲新的DTC
DTC newDTC = dtc;
newDTC.status = static_cast(DTCStatus::ConfirmedDTC) |
static_cast(DTCStatus::TestFailed);
storedDTCs.push_back(newDTC);
uint32_t code = newDTC.getCode();
// 創建快照數據
uint8_t srn = 1;
snapshotRecords[code].push_back(srn);
FreezeFrame ff;
ff.srn = srn;
ff.dtcStatus = newDTC.status;
// 存儲快照數據(DID對應參數)
if (engineSpeed > 0) {
ff.snapshotData[0x1000] = {
static_cast((engineSpeed >> 8) & 0xFF),
static_cast(engineSpeed & 0xFF)
};
}
if (vehicleSpeed > 0) {
ff.snapshotData[0x1001] = {
static_cast((vehicleSpeed >> 8) & 0xFF),
static_cast(vehicleSpeed & 0xFF)
};
}
// 添加時間戳
ff.snapshotData[0x1002] = {0x00, 0x00, 0x00, 0x01}; // 虛擬時間戳
freezeFrames[code][srn] = ff;
}
// 安全訪問授權
void grantSecurityAccess() {
securityAccessGranted = true;
}
// 顯示當前所有DTC
void displayDTCs() const {
std::cout << "=== 當前存儲的DTC列表 ===" << std::endl;
if (storedDTCs.empty()) {
std::cout << "無存儲的DTC" << std::endl;
}
for (const auto& dtc : storedDTCs) {
std::cout << "DTC: 0x" << std::hex << dtc.getCode()
<< " -> " << dtc.toString() << std::endl;
}
std::cout << "=========================" << std::endl;
}
};
6.3 主函數與測試示例

int main() {
DTCEcuSimulator ecu;
std::cout << "========== UDS DTC服務測試 ==========" << std::endl;
// 測試1:模擬DTC發生
std::cout << "\n【測試1】模擬故障發生" << std::endl;
DTC dtc1(0x01, 0x23, 0x17); // P0123 - 節氣門位置傳感器電壓低
DTC dtc2(0x01, 0x34, 0x02); // P0134 - 氧傳感器信號偏高
DTC dtc3(0x02, 0x45, 0x04); // C0245 - 輪速傳感器信號中斷
ecu.simulateDTC(dtc1, 2500, 80); // 發動機2500rpm, 車速80km/h
ecu.simulateDTC(dtc2, 2800, 65);
ecu.simulateDTC(dtc3, 0, 45); // 輪速傳感器故障時的數據
ecu.displayDTCs();
// 測試2:0x19 01 - 獲取DTC數量
std::cout << "\n【測試2】0x19 01 - 統計DTC數量" << std::endl;
std::vector countResp = ecu.handleReadDTCCount(0x09); // 當前活動故障
std::cout << "請求: 19 01 09" << std::endl;
std::cout << "響應: ";
for (auto b : countResp) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)b << " ";
}
std::cout << std::endl;
// 測試3:0x19 02 - 讀取DTC列表
std::cout << "\n【測試3】0x19 02 - 讀取DTC列表" << std::endl;
std::vector listResp = ecu.handleReadDTCList(0x09);
std::cout << "請求: 19 02 09" << std::endl;
std::cout << "響應: ";
for (auto b : listResp) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)b << " ";
}
std::cout << std::endl;
// 測試4:0x19 03 - 獲取快照記錄編號
std::cout << "\n【測試4】0x19 03 - 獲取快照記錄編號" << std::endl;
uint32_t dtcCode = dtc1.getCode();
std::vector srnResp = ecu.handleGetSnapshotRecordNumbers(dtcCode);
std::cout << "請求: 19 03 " << std::hex << ((dtcCode >> 16) & 0xFF) << " "
<< ((dtcCode >> 8) & 0xFF) << " " << (dtcCode & 0xFF) << std::endl;
std::cout << "響應: ";
for (auto b : srnResp) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)b << " ";
}
std::cout << std::endl;
// 測試5:0x19 04 - 讀取快照數據
std::cout << "\n【測試5】0x19 04 - 讀取快照數據" << std::endl;
std::vector snapResp = ecu.handleReadSnapshotData(dtcCode, 0x01);
std::cout << "請求: 19 04 " << std::hex << ((dtcCode >> 16) & 0xFF) << " "
<< ((dtcCode >> 8) & 0xFF) << " " << (dtcCode & 0xFF) << " 01" << std::endl;
std::cout << "響應: ";
for (auto b : snapResp) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)b << " ";
}
std::cout << std::endl;
// 測試6:0x14 - 清除DTC(需要安全訪問)
std::cout << "\n【測試6】0x14 - 清除診斷信息" << std::endl;
std::vector clearReq = {0xFF, 0xFF, 0xFF};
// 未授權時清除
std::vector clearResp1 = ecu.handleClearDiagnosticInfo(clearReq);
std::cout << "未授權清除請求響應: ";
for (auto b : clearResp1) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)b << " ";
}
std::cout << " (NRC 0x33: 需要安全訪問)" << std::endl;
// 授權后清除
ecu.grantSecurityAccess();
std::vector clearResp2 = ecu.handleClearDiagnosticInfo(clearReq);
std::cout << "授權后清除請求響應: ";
for (auto b : clearResp2) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)b << " ";
}
std::cout << " (肯定響應0x54)" << std::endl;
// 驗證清除結果
ecu.displayDTCs();
// 測試7:0x19 0A - 讀取所有支持的DTC
std::cout << "\n【測試7】0x19 0A - 讀取所有支持的DTC(清除后)" << std::endl;
std::vector supportedResp = ecu.handleReadSupportedDTCs();
std::cout << "請求: 19 0A" << std::endl;
std::cout << "響應: ";
for (auto b : supportedResp) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)b << " ";
}
std::cout << std::endl;
return 0;
}
6.4 編譯與運行說明

# 編譯命令
g++ -std=c++11 -o uds_dtc uds_dtc.cpp


# 運行
./uds_dtc

預期輸出示例

========== UDS DTC服務測試 ==========

【測試1】模擬故障發生
=== 當前存儲的DTC列表 ===
DTC: 0x12317 -> P0123 - 電壓低于閾值 [Status: 0x09]
DTC: 0x13402 -> P0134 - 信號偏高 [Status: 0x09]
DTC: 0x24504 -> C0245 - 信號中斷 [Status: 0x09]
=========================

【測試2】0x19 01 - 統計DTC數量
請求: 19 01 09
響應: 59 01 ff 01 00 03

【測試3】0x19 02 - 讀取DTC列表
請求: 19 02 09
響應: 59 02 ff 01 23 17 09 01 34 02 09 02 45 04 09

【測試4】0x19 03 - 獲取快照記錄編號
請求: 19 03 01 23 17
響應: 59 03 01 23 17 01

【測試5】0x19 04 - 讀取快照數據
請求: 19 04 01 23 17 01
響應: 59 04 01 23 17 09 01 10 00 09 C4 10 01 00 50 10 02 00 00 00 01

【測試6】0x14 - 清除診斷信息
未授權清除請求響應: 7f 14 33 (NRC 0x33: 需要安全訪問)
授權后清除請求響應: 54 (肯定響應0x54)
=== 當前存儲的DTC列表 ===
無存儲的DTC
=========================

【測試7】0x19 0A - 讀取所有支持的DTC(清除后)
請求: 19 0A
響應: 59 0a ff
七、總結

本文對UDS協議中的DTC相關服務進行了詳細分析:

服務

核心功能

關鍵子功能

0x19

讀取DTC信息

01H(計數)、02H(列表)、03H/04H(快照)、0AH(所有DTC)

0x14

清除診斷信息

0xFFFFFF(清除所有)

關鍵技術點

  1. DTC結構 :3字節編碼,前2字節標識故障位置,第3字節(FTB)描述故障模式

  2. 狀態掩碼 :8位狀態機,支持精確篩選故障類型

  3. 快照機制 :故障發生時自動記錄環境數據,便于故障復現與分析

  4. 安全機制 :清除操作通常需要安全訪問權限

實際開發中,ECU應確保DTC存儲的持久性(如EEPROM),避免掉電丟失診斷數據。

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

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.

相關推薦
熱點推薦
100萬公里,成了汽車行業不敢提的詞?

100萬公里,成了汽車行業不敢提的詞?

虎嗅APP
2026-05-14 18:07:07
44歲卡里克確認轉正!簽約3年 救火4個月率曼聯重返歐冠+15戰10勝

44歲卡里克確認轉正!簽約3年 救火4個月率曼聯重返歐冠+15戰10勝

我愛英超
2026-05-15 22:10:38
特朗普離京前,對臺灣問題已作明確表態,解讀如下:

特朗普離京前,對臺灣問題已作明確表態,解讀如下:

大中國
2026-05-15 21:04:02
新婚15天就爆不倫!日諧星床戰照外泄 人妻私訊「穿最色內褲」求歡

新婚15天就爆不倫!日諧星床戰照外泄 人妻私訊「穿最色內褲」求歡

ETtoday星光云
2026-05-14 15:58:05
中央氣象臺連發大霧暴雨強對流預警!廣東南部沿海有大暴雨

中央氣象臺連發大霧暴雨強對流預警!廣東南部沿海有大暴雨

南方都市報
2026-05-15 10:50:26
中美這場舉世矚目的會晤,釋放了哪些重要信號?

中美這場舉世矚目的會晤,釋放了哪些重要信號?

補壹刀
2026-05-15 14:03:13
新能源概念通脹退潮后,誰在裸泳?

新能源概念通脹退潮后,誰在裸泳?

虎嗅APP
2026-04-23 22:36:41
江西舉報恩人沈女士已社死,正臉照曝光,大叔崗位被調,景區回應

江西舉報恩人沈女士已社死,正臉照曝光,大叔崗位被調,景區回應

奇思妙想草葉君
2026-05-15 07:33:51
U17國足極速扳平!萬項戲耍沙特防線,3場造4球,鄺兆鐳助攻

U17國足極速扳平!萬項戲耍沙特防線,3場造4球,鄺兆鐳助攻

奧拜爾
2026-05-16 01:35:34
悲催!網傳四川一貿易公司半夜倒閉,工資馬上發,員工哭訴失業了

悲催!網傳四川一貿易公司半夜倒閉,工資馬上發,員工哭訴失業了

火山詩話
2026-05-15 14:45:12
國企為什么不上桌?

國企為什么不上桌?

家傳編輯部
2026-05-15 15:17:35
馬特·達蒙新片大賣,全員發獎金

馬特·達蒙新片大賣,全員發獎金

娛圈觀察員
2026-05-15 01:31:22
持續引領百萬級豪華市場,攬勝與路虎衛士的不可替代性從何而來?

持續引領百萬級豪華市場,攬勝與路虎衛士的不可替代性從何而來?

球叔教你買車
2026-04-29 09:24:34
影壇大咖去世,66歲鐘楚紅淚灑靈堂,周星馳周潤發送花,眾星現身

影壇大咖去世,66歲鐘楚紅淚灑靈堂,周星馳周潤發送花,眾星現身

開開森森
2026-05-15 08:51:25
戛納紅毯第二彈!章澤天好美,袁姍姍嚇我一跳,周也沒扛住生圖

戛納紅毯第二彈!章澤天好美,袁姍姍嚇我一跳,周也沒扛住生圖

八卦南風
2026-05-15 15:58:56
特朗普結束訪華,大贊中南海景致:若待得慣都不想走

特朗普結束訪華,大贊中南海景致:若待得慣都不想走

澎湃新聞
2026-05-15 18:28:12
英超官方承認曼城獲利,VAR漏判恐讓阿森納痛失冠軍

英超官方承認曼城獲利,VAR漏判恐讓阿森納痛失冠軍

樂道足球C
2026-05-15 20:34:33
保時捷中國高管喊話被抄襲無奈,羅永浩怒懟:論流氓誰能跟保時捷比,新能源抄了保時捷的,不是只有那個誰和那個誰嗎

保時捷中國高管喊話被抄襲無奈,羅永浩怒懟:論流氓誰能跟保時捷比,新能源抄了保時捷的,不是只有那個誰和那個誰嗎

大風新聞
2026-05-15 12:21:07
成交價1.1億!國際足聯低頭,央視拿下世界杯版權,卻遭全網吐槽

成交價1.1億!國際足聯低頭,央視拿下世界杯版權,卻遭全網吐槽

譚談社會
2026-05-15 16:49:00
張雪機車再拿第一!WSBK捷克站自由賽:53號車手德比斯奪全場第一

張雪機車再拿第一!WSBK捷克站自由賽:53號車手德比斯奪全場第一

快科技
2026-05-15 18:00:34
2026-05-16 03:00:49
新能源自動駕駛 incentive-icons
新能源自動駕駛
專注于半導體行業資訊
977文章數 347關注度
往期回顧 全部

科技要聞

直降千元起步!蘋果華為率先開啟618讓利

頭條要聞

黃仁勛在北京喝豆汁痛苦皺眉 問“這是什么東西”

頭條要聞

黃仁勛在北京喝豆汁痛苦皺眉 問“這是什么東西”

體育要聞

德約科維奇買的球隊,從第6級聯賽升入法甲

娛樂要聞

方媛為何要來《桃花塢6》沒苦硬吃?

財經要聞

騰訊掉隊,馬化騰戳破真相

汽車要聞

高爾夫GTI刷新紐北紀錄 ID. Polo GTI迎全球首秀

態度原創

健康
旅游
房產
教育
家居

專家揭秘干細胞回輸的安全風險

旅游要聞

藏在沈陽鬧市的金色秘境!2 萬㎡油菜花全開,地鐵直達還免費

房產要聞

老黃埔熱銷之下,珠江春,為何去化僅3成?

教育要聞

2027英國留學費用+排名+雅思要求一篇看懂

家居要聞

110㎡淡而有致的生活表達

無障礙瀏覽 進入關懷版