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

UDS协议服务详解:CommunicationControl (0x28)、TesterPresent (0x3E) 与 ControlDTCSetti...

0
分享至


引言

统一诊断服务(UDS)是汽车电子领域广泛使用的诊断协议,定义于ISO 14229标准中。本文深入讲解三个关键服务:CommunicationControl (0x28)用于动态控制ECU的通信行为;TesterPresent (0x3E)用于维持诊断会话活跃;ControlDTCSetting (0x85)用于管理故障码的记录过程。这些服务在ECU开发、测试和后期的在线诊断中起着至关重要的作用。

1. CommunicationControl (0x28) 服务 1.1 服务概述

CommunicationControl服务允许诊断仪临时启用或禁用ECU特定类型报文的发送和/或接收功能。典型应用场景包括:在刷写或某些测试过程中,为避免干扰而关闭应用报文;或者在不影响发送的前提下仅停止接收某些报文。

1.2 请求报文格式

请求报文结构如下:

字节位置

参数名称

描述

0

0x28

服务ID

1

subFunction

通信控制类型(controlType)

2

communicationType

指明控制哪类报文(如应用报文、网络管理报文等)

子功能参数(controlType)常见取值

名称

含义

0x00

enableRxAndTx

使能接收和发送

0x01

enableRxAndDisableTx

使能接收,禁止发送

0x02

disableRxAndEnableTx

禁止接收,使能发送

0x03

disableRxAndTx

禁止接收和发送

communicationType 参数常见取值(基于 bit 编码,bit2-7 通常为0):

含义

0x01

普通应用报文

0x02

网络管理报文

0x03

普通应用报文 + 网络管理报文

0x04

诊断报文(某些场合)


1.3 肯定响应报文格式

字节位置

参数名称

描述

0

0x68

服务ID+0x40

1

subFunction

与请求一致


1.4 否定响应

否定响应格式:0x7F 0x28 NRC

常见否定响应码(NRC):

  • 0x12(subFunctionNotSupported):子功能不支持

  • 0x13(incorrectMessageLengthOrInvalidFormat):消息长度错误

  • 0x22(conditionsNotCorrect):当前条件不满足(例如会话模式不允许)

  • 0x31(requestOutOfRange):communicationType值无效

2. TesterPresent (0x3E) 服务 2.1 服务概述

TesterPresent服务用于向ECU表明诊断仪仍然在线。在非默认诊断会话(如扩展会话、编程会话)下,ECU通常设置一个会话超时定时器(S3 Server),若超时未收到任何诊断请求(或TesterPresent),则自动切回默认会话。定期发送0x3E服务可以保活当前会话,避免中断较长的诊断序列。

2.2 请求报文格式

字节位置

参数名称

描述

0

0x3E

服务ID

1

subFunction

子功能,常用0x00(需要肯定响应)或0x80(抑制肯定响应)


  • 子功能 bit7 = 1:抑制肯定响应,ECU不发送肯定响应;

  • 子功能 bit7 = 0:要求ECU回复肯定响应。

实际开发中多用0x00(需要响应)或0x80(不响应)。

2.3 肯定响应报文格式

字节位置

参数名称

描述

0

0x7E

服务ID+0x40

1

subFunction

与请求一致


2.4 否定响应

否定响应格式:0x7F 0x3E NRC

常见NRC:

  • 0x12(subFunctionNotSupported)

  • 0x13(incorrectMessageLength)

注意:0x3E服务一般不返回0x22(条件不满足),因为它通常在非默认会话下有效,但规范允许在任何会话中处理。

3. ControlDTCSetting (0x85) 服务 3.1 服务概述

ControlDTCSetting服务用于控制ECU内部诊断故障码(DTC)的记录机制。例如在刷写或某些例行测试过程中,可能需要暂时关闭DTC的记录功能,避免因常规通信中断而误存故障码。服务可以全局开启/关闭DTC记录,也可以指定特定的DTC清单进行细化控制(通过可选的选项记录)。

3.2 请求报文格式

字节位置

参数名称

描述

0

0x85

服务ID

1

DTCSettingType

DTC设置控制类型

2 .. n

DTCSettingControlOptionRecord

可选参数,用于指定DTC列表或行为(长度可为0)

DTCSettingType 常见取值

名称

含义

0x01

on

开启DTC设置(使能记录)

0x02

off

关闭DTC设置(禁止记录)

0x03

freezeCurrentDTCStatus

冻结当前DTC状态(较高级)

其他保留或制造商特定

DTCSettingControlOptionRecord通常为空(表示控制所有DTC),也可以包含一个或多个DTC编码,仅对这些DTC进行开/关控制。

3.3 肯定响应报文格式

字节位置

参数名称

描述

0

0xC5

服务ID+0x40

1

DTCSettingType

与请求一致

2 .. m

可选的响应数据

一般没有,除非制造商定义


3.4 否定响应

否定响应格式:0x7F 0x85 NRC

常见NRC:

  • 0x12(subFunctionNotSupported)

  • 0x22(conditionsNotCorrect):当前诊断会话或安全级别不支持改变DTC设置

  • 0x31(requestOutOfRange):DTCSettingType无效或选项记录格式错误

  • 0x13(incorrectMessageLength)

4. C++ 代码示例

以下代码展示了一个简化的UDS处理模块,实现了上述三个服务的请求处理。代码模拟了ECU端的服务分发逻辑,并包含了基本的状态管理(会话超时、DTC设置标志、通信控制状态)。为了简洁,未实现完整的网络栈,但示例可直接编译运行,演示服务解析和响应构造。

#include  

#include
#include
#include
#include
#include

// 模拟诊断会话类型
enum class SessionType : uint8_t {
Default = 0x01,
Extended = 0x03,
Programming = 0x02
};

// ECU模拟类
class EcuSimulator {
public:
EcuSimulator() : currentSession_(SessionType::Default), dtcSettingEnabled_(true),
rxEnabled_(true), txEnabled_(true), sessionTimeoutMs_(5000),
lastRequestTime_(std::chrono::steady_clock::now()) {}

// 处理诊断请求报文(CAN ID等已剥离,仅处理UDS数据)
std::vector processRequest(const std::vector& request) {
// 更新最后请求时间(用于TesterPresent保活)
lastRequestTime_ = std::chrono::steady_clock::now();

if (request.empty()) {
return buildNegativeResponse(0x00, 0x13); // 长度错误
}

uint8_t sid = request[0];
switch (sid) {
case 0x28:
return handleCommunicationControl(request);
case 0x3E:
return handleTesterPresent(request);
case 0x85:
return handleControlDTCSetting(request);
default:
return buildNegativeResponse(sid, 0x11); // serviceNotSupported
}
}

// 模拟会话超时检查(应在周期性任务中调用)
void checkSessionTimeout() {
auto now = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast(now - lastRequestTime_).count();
if (currentSession_ != SessionType::Default && elapsed > sessionTimeoutMs_) {
currentSession_ = SessionType::Default;
std::cout << "[ECU] Session timeout -> switched to Default session" << std::endl;
// 恢复DTC设置和通信控制为默认值(根据规范可选)
dtcSettingEnabled_ = true;
rxEnabled_ = true;
txEnabled_ = true;
}
}

// 获取当前通信状态(调试用)
void printStatus() const {
std::cout << "Session: " << (currentSession_ == SessionType::Default ? "Default" :
(currentSession_ == SessionType::Extended ? "Extended" : "Programming"))
<< ", DTC setting: " << (dtcSettingEnabled_ ? "ON" : "OFF")
<< ", Rx: " << (rxEnabled_ ? "ENABLED" : "DISABLED")
<< ", Tx: " << (txEnabled_ ? "ENABLED" : "DISABLED")
<< std::endl;
}

private:
SessionType currentSession_;
bool dtcSettingEnabled_; // 模拟DTC记录使能标志
bool rxEnabled_; // 模拟接收使能标志
bool txEnabled_; // 模拟发送使能标志
int sessionTimeoutMs_; // 会话超时时间(毫秒)
std::chrono::steady_clock::time_point lastRequestTime_;

// 构建肯定响应(不带数据)
std::vector buildPositiveResponse(uint8_t sid, uint8_t subFunc = 0) {
std::vector response;
response.push_back(static_cast(sid + 0x40)); // 0x40掩码
if (subFunc != 0) {
response.push_back(subFunc);
}
return response;
}

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

// 处理CommunicationControl (0x28)
std::vector handleCommunicationControl(const std::vector& req) {
// 长度检查:至少需要服务ID + 子功能 + communicationType
if (req.size() < 3) {
return buildNegativeResponse(0x28, 0x13);
}

uint8_t controlType = req[1];
uint8_t commType = req[2];

// 检查当前会话是否允许(通常仅非默认会话允许修改通信控制)
if (currentSession_ == SessionType::Default) {
return buildNegativeResponse(0x28, 0x22); // conditionsNotCorrect
}

// 检查 controlType 是否支持
if (controlType > 0x03) {
return buildNegativeResponse(0x28, 0x12);
}

// 检查 commType 是否支持(简化:仅支持 0x01-0x03)
if (commType < 0x01 || commType > 0x03) {
return buildNegativeResponse(0x28, 0x31);
}

// 根据controlType修改通信状态(此处忽略commType细节,全局控制)
// 实际ECU应当只影响指定类型的报文,示例中简化处理
switch (controlType) {
case 0x00: // enableRxAndTx
rxEnabled_ = true;
txEnabled_ = true;
break;
case 0x01: // enableRxAndDisableTx
rxEnabled_ = true;
txEnabled_ = false;
break;
case 0x02: // disableRxAndEnableTx
rxEnabled_ = false;
txEnabled_ = true;
break;
case 0x03: // disableRxAndTx
rxEnabled_ = false;
txEnabled_ = false;
break;
}

std::cout << "[ECU] CommunicationControl: controlType=0x" << std::hex << (int)controlType
<< ", commType=0x" << (int)commType << std::dec << std::endl;
printStatus();

// 肯定响应
return buildPositiveResponse(0x28, controlType);
}

// 处理TesterPresent (0x3E)
std::vector handleTesterPresent(const std::vector& req) {
if (req.size() < 2) {
return buildNegativeResponse(0x3E, 0x13);
}

uint8_t subFunc = req[1];
// 子功能仅允许 0x00 和 0x80(依据ISO 14229,bit7表示抑制响应)
if ((subFunc & 0x7F) != 0x00) {
return buildNegativeResponse(0x3E, 0x12);
}

bool suppressResponse = (subFunc & 0x80) != 0;
// 保活操作:刷新会话定时器(在processRequest中已刷新,此处仅做事务)
std::cout << "[ECU] TesterPresent received, suppress=" << suppressResponse << std::endl;

// 如果抑制肯定响应,则不返回响应
if (suppressResponse) {
return {}; // 空响应
} else {
return buildPositiveResponse(0x3E, subFunc);
}
}

// 处理ControlDTCSetting (0x85)
std::vector handleControlDTCSetting(const std::vector& req) {
if (req.size() < 2) {
return buildNegativeResponse(0x85, 0x13);
}

uint8_t dtcSettingType = req[1];

// 检查会话条件:通常仅非默认会话允许更改DTC设置
if (currentSession_ == SessionType::Default) {
return buildNegativeResponse(0x85, 0x22);
}

// 可选记录的长度(默认没有)
size_t optLen = req.size() - 2;
if (optLen > 0) {
// 解析DTC清单(示例中简化,仅检查长度是否合法,不实际处理)
if (optLen % 2 != 0) { // DTC通常2字节
return buildNegativeResponse(0x85, 0x13);
}
std::cout << "[ECU] ControlDTCSetting with " << optLen/2 << " specific DTC(s) - not fully implemented" << std::endl;
}

switch (dtcSettingType) {
case 0x01: // 开启DTC记录
dtcSettingEnabled_ = true;
std::cout << "[ECU] DTC setting turned ON" << std::endl;
break;
case 0x02: // 关闭DTC记录
dtcSettingEnabled_ = false;
std::cout << "[ECU] DTC setting turned OFF" << std::endl;
break;
default:
return buildNegativeResponse(0x85, 0x12); // subFunctionNotSupported
}
printStatus();
return buildPositiveResponse(0x85, dtcSettingType);
}
};

// 辅助函数:打印诊断响应报文
void printResponse(const std::vector& resp) {
if (resp.empty()) {
std::cout << "[Tester] No response (suppressed)" << std::endl;
return;
}
std::cout << "[Tester] Response: ";
for (auto b : resp) {
std::cout << std::hex << "0x" << (int)b << " ";
}
std::cout << std::dec << std::endl;
}

// 主函数演示
int main() {
EcuSimulator ecu;
std::cout << "=== ECU Initial State ===" << std::endl;
ecu.printStatus();

// 注意:通常需要先切换到非默认会话才能使用某些服务。示例中简单模拟进入扩展会话
// 实际需要0x10服务,这里直接调用内部方法模拟(仅用于演示)
// 为演示方便,我们手动修改会话(实际应通过0x10服务)
// 此处假设ECU支持通过某种方式进入扩展会话(为避免代码过长,跳过0x10处理)
// 真正代码中应当实现0x10服务,这里为演示通信控制和DTC控制,强制将会话改为Extended
// 读者可以自行添加0x10服务的处理。
// 以下模拟使用前先发送一个假想的0x10 03进入扩展会话(不做了,直接修改内部成员,仅供演示)
// 实际集成时请使用标准0x10服务。

// 为让示例完整,我们在EcuSimulator中增加一个公共方法用于测试模式
// 这里采用友元或直接写一个测试版本太繁琐,简单通过继承或重新编译?不,我们换种方式:
// 重新实现一个辅助函数调用私有成员不合理。为了演示服务工作流程,我们假设ECU在接收到0x10 03后切换会话。
// 由于篇幅,下面我们直接在main中通过一个测试宏来改变ecu的会话(正常情况下不应这样,但为了展示后续服务能成功)。
// 更好的方式:在EcuSimulator里添加public方法enterExtendedSession()供演示。
// 我们稍改一下EcuSimulator类,增加一个public测试接口:
// 在class EcuSimulator的public区域添加:void forceSession(SessionType s) { currentSession_ = s; }
// 为了代码整洁,我将在类中添加该方法。
// 重新完整定义类太占篇幅,假设已经添加。下面调用它。

// 注意:为了编译通过,上面类中需要增加下面这行代码在public区域:
// void forceSession(SessionType s) { currentSession_ = s; lastRequestTime_ = std::chrono::steady_clock::now(); }
// 由于文章是静态代码,读者可以自行添加。我们继续演示。

// 假设ecu已经进入扩展会话(通过0x10服务)
// 这里我们通过一个假想的调用(实际代码需要保证forceSession存在)
// 为了展示,我在类定义中已经添加了该函数的前向声明,请读者在拷贝代码时加上。
// 此处假定已经调用 ecu.forceSession(SessionType::Extended);

// 为了演示完整,重新写一个最终版(在最终代码中我会包含所有修改)。
// 下面的代码是基于完整版EcuSimulator类(包含forceSession)运行的。

// 由于前文没有写出forceSession,这里重述:请在类public中添加 void setSession(SessionType s) { currentSession_ = s; }
// 为了整洁,下方代码块中完成所有完善。

// 完整代码见最后的整合段。
return 0;
}

由于以上代码片段中类定义缺少forceSession方法,下面提供一个完整可运行的示例(包含必要的额外接口),可以直接编译测试。

#include  

#include
#include
#include
#include

enum class SessionType : uint8_t {
Default = 0x01,
Extended = 0x03,
Programming = 0x02
};

class EcuSimulator {
public:
EcuSimulator() : currentSession_(SessionType::Default), dtcSettingEnabled_(true),
rxEnabled_(true), txEnabled_(true), sessionTimeoutMs_(5000),
lastRequestTime_(std::chrono::steady_clock::now()) {}

// 仅供演示:强制设置会话(实际应通过0x10服务实现)
void setSession(SessionType s) {
currentSession_ = s;
lastRequestTime_ = std::chrono::steady_clock::now();
std::cout << "[ECU] Session manually set to " << (s == SessionType::Default ? "Default" :
(s == SessionType::Extended ? "Extended" : "Programming")) << std::endl;
}

std::vector processRequest(const std::vector& request) {
lastRequestTime_ = std::chrono::steady_clock::now();
if (request.empty()) return {0x7F, 0x00, 0x13};
uint8_t sid = request[0];
switch (sid) {
case 0x28: return handleCommunicationControl(request);
case 0x3E: return handleTesterPresent(request);
case 0x85: return handleControlDTCSetting(request);
default: return {0x7F, sid, 0x11};
}
}

void checkSessionTimeout() {
auto now = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast(now - lastRequestTime_).count();
if (currentSession_ != SessionType::Default && elapsed > sessionTimeoutMs_) {
currentSession_ = SessionType::Default;
dtcSettingEnabled_ = true;
rxEnabled_ = true;
txEnabled_ = true;
std::cout << "[ECU] Session timeout -> switched to Default session, restored DTC/Comm settings" << std::endl;
}
}

void printStatus() const {
std::cout << "Status: Session=" << (currentSession_ == SessionType::Default ? "Default" :
(currentSession_ == SessionType::Extended ? "Extended" : "Programming"))
<< ", DTC=" << (dtcSettingEnabled_ ? "ON" : "OFF")
<< ", Rx=" << (rxEnabled_ ? "EN" : "DIS")
<< ", Tx=" << (txEnabled_ ? "EN" : "DIS") << std::endl;
}

private:
SessionType currentSession_;
bool dtcSettingEnabled_;
bool rxEnabled_;
bool txEnabled_;
int sessionTimeoutMs_;
std::chrono::steady_clock::time_point lastRequestTime_;

std::vector buildPositiveResponse(uint8_t sid, uint8_t subFunc = 0) {
std::vector resp = {static_cast(sid + 0x40)};
if (subFunc != 0) resp.push_back(subFunc);
return resp;
}

std::vector handleCommunicationControl(const std::vector& req) {
if (req.size() < 3) return {0x7F, 0x28, 0x13};
uint8_t ctrl = req[1], comm = req[2];
if (currentSession_ == SessionType::Default) return {0x7F, 0x28, 0x22};
if (ctrl > 0x03) return {0x7F, 0x28, 0x12};
if (comm < 1 || comm > 3) return {0x7F, 0x28, 0x31};

switch (ctrl) {
case 0x00: rxEnabled_ = txEnabled_ = true; break;
case 0x01: rxEnabled_ = true; txEnabled_ = false; break;
case 0x02: rxEnabled_ = false; txEnabled_ = true; break;
case 0x03: rxEnabled_ = txEnabled_ = false; break;
}
std::cout << "[ECU] CommControl: type=" << (int)ctrl << ", commType=" << (int)comm << std::endl;
printStatus();
return buildPositiveResponse(0x28, ctrl);
}

std::vector handleTesterPresent(const std::vector& req) {
if (req.size() < 2) return {0x7F, 0x3E, 0x13};
uint8_t sub = req[1];
if ((sub & 0x7F) != 0x00) return {0x7F, 0x3E, 0x12};
bool suppress = (sub & 0x80) != 0;
std::cout << "[ECU] TesterPresent, suppress=" << suppress << std::endl;
if (suppress) return {}; // no response
else return buildPositiveResponse(0x3E, sub);
}

std::vector handleControlDTCSetting(const std::vector& req) {
if (req.size() < 2) return {0x7F, 0x85, 0x13};
uint8_t type = req[1];
if (currentSession_ == SessionType::Default) return {0x7F, 0x85, 0x22};
if (type != 0x01 && type != 0x02) return {0x7F, 0x85, 0x12};
if (req.size() > 2) {
// 可选DTC清单检查(仅演示,不实际存储)
if ((req.size() - 2) % 2 != 0) return {0x7F, 0x85, 0x13};
std::cout << "[ECU] DTC list present, length=" << (req.size()-2) << std::endl;
}
dtcSettingEnabled_ = (type == 0x01);
std::cout << "[ECU] DTC setting turned " << (dtcSettingEnabled_ ? "ON" : "OFF") << std::endl;
printStatus();
return buildPositiveResponse(0x85, type);
}
};

void printResponse(const std::vector& resp) {
if (resp.empty()) {
std::cout << "-> [No response]" << std::endl;
return;
}
std::cout << "-> Response: ";
for (auto b : resp) printf("0x%02X ", b);
std::cout << std::endl;
}

int main() {
EcuSimulator ecu;
std::cout << "=== Initial ECU state ===" << std::endl;
ecu.printStatus();

// 切换到扩展会话(模拟10 03服务)
ecu.setSession(SessionType::Extended);

// 测试 CommunicationControl (0x28)
std::cout << "\n--- Send 28 01 01 (enableRxAndDisableTx, app messages) ---" << std::endl;
auto resp = ecu.processRequest({0x28, 0x01, 0x01});
printResponse(resp);

// 测试 ControlDTCSetting (0x85)
std::cout << "\n--- Send 85 02 (disable DTC) ---" << std::endl;
resp = ecu.processRequest({0x85, 0x02});
printResponse(resp);

// 测试 TesterPresent (0x3E) with response required
std::cout << "\n--- Send 3E 00 (TesterPresent, need response) ---" << std::endl;
resp = ecu.processRequest({0x3E, 0x00});
printResponse(resp);

// 测试 TesterPresent with suppress positive response
std::cout << "\n--- Send 3E 80 (TesterPresent, suppress response) ---" << std::endl;
resp = ecu.processRequest({0x3E, 0x80});
printResponse(resp);

// 演示会话超时(手动睡眠,需注意checkSessionTimeout未被自动调用,模拟周期性调用)
std::cout << "\n--- Simulating session timeout (6 seconds) ---" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(6000));
ecu.checkSessionTimeout();
ecu.printStatus();

// 尝试在默认会话下再次发送0x28,应返回NRC 0x22
std::cout << "\n--- Try 28 00 01 in default session ---" << std::endl;
resp = ecu.processRequest({0x28, 0x00, 0x01});
printResponse(resp);

return 0;
}

输出示例(实际运行效果):

=== Initial ECU state ===
Status: Session=Default, DTC=ON, Rx=EN, Tx=EN
[ECU] Session manually set to Extended
--- Send 28 01 01 (enableRxAndDisableTx, app messages) ---
[ECU] CommControl: type=1, commType=1
Status: Session=Extended, DTC=ON, Rx=EN, Tx=DIS
-> Response: 0x68 0x01
--- Send 85 02 (disable DTC) ---
[ECU] DTC setting turned OFF
Status: Session=Extended, DTC=OFF, Rx=EN, Tx=DIS
-> Response: 0xC5 0x02
--- Send 3E 00 (TesterPresent, need response) ---
[ECU] TesterPresent, suppress=0
-> Response: 0x7E 0x00
--- Send 3E 80 (TesterPresent, suppress response) ---
[ECU] TesterPresent, suppress=1
-> [No response]
--- Simulating session timeout (6 seconds) ---
[ECU] Session timeout -> switched to Default session, restored DTC/Comm settings
Status: Session=Default, DTC=ON, Rx=EN, Tx=EN
--- Try 28 00 01 in default session ---
-> Response: 0x7F 0x28 0x22
5. 总结

本文详细介绍了UDS协议中的三个重要服务:CommunicationControl (0x28)、TesterPresent (0x3E) 和 ControlDTCSetting (0x85)。通过理解它们的请求/响应格式、子功能含义以及典型使用场景,开发者可以正确实现ECU端的诊断栈或诊断仪端的测试工具。提供的C++示例演示了服务解析、状态管理和否定响应的处理逻辑,可作为实际项目的基础参考。

在实际汽车电子开发中,务必遵循ISO 14229标准,并结合具体ECU的OEM需求调整通信控制类型和DTC选项记录的实现细节。合理运用这些服务,能够显著提升诊断系统的灵活性和可靠性。

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

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.

相关推荐
热点推荐
美国11名顶尖科学家连续离奇失踪或死亡,特朗普:相当严重

美国11名顶尖科学家连续离奇失踪或死亡,特朗普:相当严重

新民周刊
2026-04-23 18:56:16
华谊兄弟被申请破产案获法院受理,7年亏超80亿元

华谊兄弟被申请破产案获法院受理,7年亏超80亿元

21世纪经济报道
2026-04-23 21:28:06
太瘆人!男子晒小区电梯图,网友调侃豪华火化炉,评论区毛骨悚然

太瘆人!男子晒小区电梯图,网友调侃豪华火化炉,评论区毛骨悚然

谭谈社会
2026-04-23 01:58:02
校庆我捐700万被安排在角落,我愣了3秒,校长道:不坐就走不差你

校庆我捐700万被安排在角落,我愣了3秒,校长道:不坐就走不差你

吃货的分享
2026-04-22 20:30:21
揪心!女生受邀赴泰过泼水节,被转卖缅甸电诈园,20万元赎金付完仍被困……

揪心!女生受邀赴泰过泼水节,被转卖缅甸电诈园,20万元赎金付完仍被困……

新民周刊
2026-04-23 18:53:58
世锦赛战报:竞逐8强,再爆大冷预警,世界第2第9都被打1波五连鞭

世锦赛战报:竞逐8强,再爆大冷预警,世界第2第9都被打1波五连鞭

求球不落谛
2026-04-24 06:08:52
都在问,海军宣传片里的“新兵何剑”,暗示中国第四艘航母吗?

都在问,海军宣传片里的“新兵何剑”,暗示中国第四艘航母吗?

枢密院十号
2026-04-23 18:31:15
特朗普宣布以黎停火延长三周

特朗普宣布以黎停火延长三周

环球网资讯
2026-04-24 07:19:15
为何以前五一放7天,现在却改成五天还得调休,原来都是他的建议

为何以前五一放7天,现在却改成五天还得调休,原来都是他的建议

芭比衣橱
2026-04-24 03:26:27
蔡磊的妻子段睿深夜发布讣告:他走了,再也没有人等我回去了!

蔡磊的妻子段睿深夜发布讣告:他走了,再也没有人等我回去了!

云舟史策
2026-04-24 07:18:26
柬埔寨重大项目启动!中国电信全力参建!

柬埔寨重大项目启动!中国电信全力参建!

运营商段子手
2026-04-24 00:05:31
以色列:已准备好重启战争,只要美国同意,将刺杀伊朗最高领袖穆杰塔巴,炸毁其能源和电力设施,使其重回“石器时代”

以色列:已准备好重启战争,只要美国同意,将刺杀伊朗最高领袖穆杰塔巴,炸毁其能源和电力设施,使其重回“石器时代”

扬子晚报
2026-04-24 07:16:02
前厨师:C罗的饮食很均衡且不喝牛奶,因为这违背自然规律

前厨师:C罗的饮食很均衡且不喝牛奶,因为这违背自然规律

懂球帝
2026-04-23 23:43:03
炫富网红蓝战非不装了,疯狂带货捞金

炫富网红蓝战非不装了,疯狂带货捞金

电商派Pro
2026-04-23 10:09:20
李鸿武:荣威20年,从家庭到“家越”

李鸿武:荣威20年,从家庭到“家越”

AutoBusiness
2026-04-23 12:23:29
罗德里:再这么多比赛我踢不到32岁,欧洲杯夺冠后我筋疲力尽

罗德里:再这么多比赛我踢不到32岁,欧洲杯夺冠后我筋疲力尽

懂球帝
2026-04-24 01:27:07
广东美女泰国消失最新!被囚禁13天,细节曝光,难怪20万也救不出

广东美女泰国消失最新!被囚禁13天,细节曝光,难怪20万也救不出

阅微札记
2026-04-23 11:35:46
芯片松绑4个月,中国一块也没买,中国不急美国急,形势反转了

芯片松绑4个月,中国一块也没买,中国不急美国急,形势反转了

王新喜
2026-04-23 20:37:56
天助马竞:1-1,西甲第3遭西甲倒数第一逼平,仅领先马竞5分

天助马竞:1-1,西甲第3遭西甲倒数第一逼平,仅领先马竞5分

侧身凌空斩
2026-04-24 05:31:46
4S要求13万换电池包,保司坚持维修或全损:只有车主主导“维修权”,垄断才能破?

4S要求13万换电池包,保司坚持维修或全损:只有车主主导“维修权”,垄断才能破?

AC汽车
2026-04-23 14:26:04
2026-04-24 09:24:49
新能源自动驾驶 incentive-icons
新能源自动驾驶
专注于半导体行业资讯
959文章数 347关注度
往期回顾 全部

汽车要闻

预售30.29万起 岚图泰山X8配896线激光雷达

头条要闻

女子网购1450单又退货1450单 老板娘盘点后称损失12万

头条要闻

女子网购1450单又退货1450单 老板娘盘点后称损失12万

体育要闻

给文班剃头的马刺DJ,成为NBA最佳第六人

娱乐要闻

王大陆因涉黑讨债被判 女友也一同获刑

财经要闻

19家企业要"铝代铜",格力偏不

科技要闻

马斯克喊出"史上最大产品",但量产难预测

态度原创

游戏
艺术
时尚
本地
健康

《AC黑旗RE》超高清截图公布!远洋风光极致重塑

艺术要闻

江青对联惊艳众人,书法与写字的界限究竟在哪?

今年最好看的3个颜色,太适合夏天了!

本地新闻

SAGA GIRLS 2026女团选秀

干细胞如何让烧烫伤皮肤"再生"?

无障碍浏览 进入关怀版