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

UDS 故障诊断全流程实战:从发动机无法启动到定位保险丝熔断(C++代码实现)

0
分享至



UDS 故障诊断全流程实战:从发动机无法启动到定位保险丝熔断(C++代码实现) 1. 引言

在汽车电子开发与售后维修中,UDS(Unified Diagnostic Services,统一诊断服务) 已成为 ECU(电子控制单元)诊断的事实标准。当车辆突发“无法启动”故障时,如何快速通过 OBD 接口,利用标准诊断服务链定位根本原因,是每一位汽车工程师和诊断开发人员必须掌握的技能。

本文以某 SUV 路测时突然熄火、重启失败且发动机故障灯常亮的真实场景为背景,使用 Vector CANoe 和 PCAN-USB 作为硬件工具,系统讲解 UDS 诊断的完整流程,并提供可直接集成的 C++ 代码示例(基于 PCAN 接口的封装与模拟验证)。通过本文,您将学会:

  • UDS 核心服务(10、3E、19、22、27、31、14)的用法

  • 从建立会话、读取 DTC、读取 DID、安全访问到例程控制的全链路实现

  • 如何编写 C++ 诊断客户端,复用至自动化测试或产线刷写工具中

2. 故障背景与工具准备

项目

内容

现象

SUV 路测中发动机突然熄火,无法再次启动,仪表盘发动机故障灯常亮

目标

快速定位根本原因,恢复启动

硬件工具

Vector CANoe(或 PCAN-USB 适配器)、OBD 转 DB9 线缆

软件环境

Windows 10 / Linux,C++ 编译器(g++ / MSVC),PCANBasic 动态库


实际工程中,PCAN-USB 性价比高,常配合开源库 libpcan 或 PCANBasic.dll 使用。下文代码将基于 PCANBasic API 进行封装,并提供模拟响应模式供学习和调试。
3. UDS 诊断服务链精讲

UDS(ISO 14229)定义了一系列诊断服务,通过 CAN 总线(ISO 15765-2 传输层)进行请求/响应交互。本案例使用到的服务如下:

服务 ID

名称

子功能/参数

作用

0x10

DiagnosticSessionControl

0x03 = 扩展会话

解锁全部诊断服务(读内存、例程等)

0x3E

TesterPresent

0x00

保持当前会话,防止 ECU 自动回默认会话

0x19

ReadDTCInformation

0x02 = 读取当前 DTC

获取故障码列表

0x22

ReadDataByIdentifier

DID(2 字节)

读取特定数据标识符(如传感器值)

0x27

SecurityAccess

0x01/0x02 = 请求种子/发送密钥

解锁受保护的例程或写入操作

0x31

RoutineControl

0x01 = 启动例程

执行特定功能(如燃油泵测试)

0x14

ClearDiagnosticInformation

0xFFFFFF(所有 DTC)

清除故障码

每个请求的格式一般为:[Service ID] [SubFunction / Data] ...
正常响应的格式:[Service ID + 0x40] [响应数据]
否定响应格式:0x7F [Service ID] [NRC](NRC 如 0x11=服务不支持,0x22=条件不满足等)。

4. 全流程诊断步骤(附真实数据) 4.1 建立通信 – 扩展会话 + 保活

请求: 0x10 0x03
响应: 0x50 0x03 (支持扩展会话)
请求: 0x3E 0x00 (每 2~5 秒周期性发送)
响应: 0x7E 0x00
4.2 读取故障码 – 得到 P0335 与 P0171

请求: 0x19 0x02
响应: 0x59 0x02 ... 0x0335 ... 0x0171 ...
  • P0335 :曲轴位置传感器 A 电路故障

  • P0171 :燃油系统过稀(空燃比修正超限)

4.3 读取关键 DID – 确认传感器数据异常

DID

含义

正常值

实测值

0xF190

曲轴转速信号

怠速 70 Hz

0 Hz

0xF123

燃油轨压力

怠速约 40 bar

0 bar

请求: 0x22 0xF1 0x90 → 响应数据中频率为 0
请求: 0x22 0xF1 0x23 → 响应压力为 0
4.4 执行器测试 – 燃油泵例程(需安全访问)

安全访问流程(种子-密钥):

请求种子: 0x27 0x01
响应种子: 0x67 0x01 [Seed_2bytes] (假设种子 = 0x1234)
密钥计算: key = seed ^ 0x55 (仅示例)
发送密钥: 0x27 0x02 [Key]
响应: 0x67 0x02 (解锁成功)

启动燃油泵例程:

请求: 0x31 0x01 0xFE 0x01 (例程 ID = 0xFE01,启动)
响应: 0x71 0x01 0xFE 0x01

观察到:例程激活后燃油压力恢复至 40 bar,但例程停止后压力立即归零 → 供电问题。

4.5 硬件验证与清除故障码

检查燃油泵保险丝 → 熔断 → 更换保险丝。
清除故障码:

请求: 0x14 0xFF 0xFF 0xFF
响应: 0x54 (成功)

重新启动车辆,发动机工作正常。

5. C++ 代码实现(PCAN + UDS 客户端)

下面代码实现了完整的诊断流程,包含 PCAN 硬件接口封装 和 模拟模式(便于离线测试)。
实际使用 PCANBasic.dll 时,只需替换 CanDriver 类中的底层发送/接收函数。

5.1 项目结构

UDS_Diagnostic/
├── can_driver.h/cpp # CAN 抽象层(PCAN 或模拟)
├── uds_client.h/cpp # UDS 服务封装
├── main.cpp # 故障诊断流程演示
└── CMakeLists.txt / Makefile
5.2 CAN 驱动抽象层(支持 PCAN 与模拟)

// can_driver.h
#pragma once
#include
#include
#include
#include

// CAN 帧结构
struct CanFrame {
uint32_t id; // 11位或29位ID
std::vector data;
bool isExtended = false;
};

// CAN 驱动接口
class ICanDriver {
public:
virtual ~ICanDriver() = default;
virtual bool Init(const std::string& channel) = 0;
virtual bool Send(const CanFrame& frame) = 0;
virtual bool Receive(CanFrame& frame, int timeout_ms) = 0;
};

// ---------- 模拟模式(用于测试诊断逻辑)----------
class MockCanDriver : public ICanDriver {
public:
bool Init(const std::string&) override { return true; }
bool Send(const CanFrame& frame) override {
lastRequest = frame;
return true;
}
bool Receive(CanFrame& frame, int) override {
// 模拟 ECU 对 UDS 请求的响应(根据实际诊断流程预设)
if (lastRequest.data.empty()) return false;
uint8_t svc = lastRequest.data[0];
frame.id = 0x7E8; // 物理响应 ID
frame.data.clear();

// 模拟不同服务的响应数据
if (svc == 0x10) { // 扩展会话响应
frame.data = {0x50, 0x03};
}
else if (svc == 0x3E) {
frame.data = {0x7E, 0x00};
}
else if (svc == 0x19 && lastRequest.data[1] == 0x02) {
// DTC: P0335 (0x0335), P0171 (0x0171)
frame.data = {0x59, 0x02, 0x00, 0x03, 0x35, 0x00, 0x01, 0x71};
}
else if (svc == 0x22) {
uint16_t did = (lastRequest.data[1] << 8) | lastRequest.data[2];
if (did == 0xF190) { // 曲轴转速
frame.data = {0x62, 0xF1, 0x90, 0x00, 0x00}; // 0 Hz
} else if (did == 0xF123) { // 燃油压力
frame.data = {0x62, 0xF1, 0x23, 0x00, 0x00}; // 0 bar
}
}
else if (svc == 0x27) {
if (lastRequest.data[1] == 0x01) { // 请求种子
frame.data = {0x67, 0x01, 0x12, 0x34}; // 种子=0x1234
} else if (lastRequest.data[1] == 0x02) {
// 验证密钥(简单异或0x55)
uint8_t key_high = lastRequest.data[2];
uint8_t key_low = lastRequest.data[3];
if ((key_high == 0x12 ^ 0x55) && (key_low == 0x34 ^ 0x55))
frame.data = {0x67, 0x02}; // 成功
else
frame.data = {0x7F, 0x27, 0x35}; // NRC 0x35: 无效密钥
}
}
else if (svc == 0x31 && lastRequest.data[1] == 0x01) {
frame.data = {0x71, 0x01, lastRequest.data[2], lastRequest.data[3]};
}
else if (svc == 0x14) {
frame.data = {0x54};
}
else {
// 否定响应: 服务不支持
frame.data = {0x7F, svc, 0x11};
}
return true;
}
private:
CanFrame lastRequest;
};

// ---------- 真实 PCAN 驱动 ----------
#ifdef USE_PCAN
#include "PCANBasic.h"
class PcanDriver : public ICanDriver {
public:
bool Init(const std::string& channel) override {
// channel 如 "PCAN_USBBUS1"
handle = PCAN_USBBUS1; // 需根据字符串映射
TPCANStatus st = CAN_Initialize(handle, PCAN_BAUD_500K);
return st == PCAN_ERROR_OK;
}
bool Send(const CanFrame& frame) override {
TPCANMsg msg;
msg.ID = frame.id;
msg.LEN = static_cast (frame.data.size());
msg.MSGTYPE = frame.isExtended ? PCAN_MESSAGE_EXTENDED : PCAN_MESSAGE_STANDARD;
memcpy(msg.DATA, frame.data.data(), frame.data.size());
return CAN_Write(handle, &msg) == PCAN_ERROR_OK;
}
bool Receive(CanFrame& frame, int timeout_ms) override {
TPCANMsg msg;
TPCANStatus st = CAN_Read(handle, &msg, nullptr);
if (st == PCAN_ERROR_OK) {
frame.id = msg.ID;
frame.data.assign(msg.DATA, msg.DATA + msg.LEN);
return true;
}
return false;
}
private:
TPCANHandle handle;
};
#endif
5.3 UDS 客户端封装

// uds_client.h
#pragma once
#include "can_driver.h"
#include
#include
#include
#include

class UdsClient {
public:
explicit UdsClient(std::shared_ptr driver) ;
// 高层诊断 API
bool SetDiagnosticSession(uint8_t sessionType); // 10 03
bool TesterPresent(); // 3E 00
std::vector ReadCurrentDTC(); // 19 02
std::vector ReadDataByIdentifier(uint16_t did); // 22
bool SecurityAccess(uint8_t level, std::function keyCalc);
bool RoutineControl(uint16_t routineId, uint8_t controlType); // 31 01/02/03
bool ClearDTC(); // 14 FF FF FF

private:
std::shared_ptr can;
bool SendRequest(const std::vector& req, std::vector& resp, int timeout_ms = 100);
bool WaitForResponse(uint32_t expectedRespId, std::vector& resp, int timeout_ms);
uint32_t reqCanId = 0x7E0; // 物理请求 ID(取决于 ECU)
uint32_t respCanId = 0x7E8; // 物理响应 ID
};

// uds_client.cpp
#include "uds_client.h"
#include
#include

UdsClient::UdsClient(std::shared_ptr driver) : can(driver) {}

bool UdsClient::SendRequest(const std::vector& req, std::vector& resp, int timeout_ms) {
CanFrame txFrame;
txFrame.id = reqCanId;
txFrame.data = req;
if (!can->Send(txFrame)) return false;

return WaitForResponse(respCanId, resp, timeout_ms);
}

bool UdsClient::WaitForResponse(uint32_t expectedId, std::vector& resp, int timeout_ms) {
auto start = std::chrono::steady_clock::now();
CanFrame rxFrame;
while (std::chrono::duration_cast(
std::chrono::steady_clock::now() - start).count() < timeout_ms) {
if (can->Receive(rxFrame, 10)) {
if (rxFrame.id == expectedId && !rxFrame.data.empty()) {
resp = rxFrame.data;
// 检查否定响应
if (resp[0] == 0x7F) {
std::cerr << "Negative response: NRC = 0x" << std::hex << (int)resp[2] << std::endl;
return false;
}
return true;
}
}
}
return false;
}

bool UdsClient::SetDiagnosticSession(uint8_t sessionType) {
std::vector req = {0x10, sessionType};
std::vector resp;
if (SendRequest(req, resp) && resp[0] == 0x50 && resp[1] == sessionType) {
std::cout << "扩展会话激活成功" << std::endl;
return true;
}
return false;
}

bool UdsClient::TesterPresent() {
std::vector req = {0x3E, 0x00};
std::vector resp;
if (SendRequest(req, resp) && resp[0] == 0x7E) {
std::cout << "TesterPresent 保活成功" << std::endl;
return true;
}
return false;
}

std::vector UdsClient::ReadCurrentDTC() {
std::vector req = {0x19, 0x02};
std::vector resp;
std::vector dtcList;
if (SendRequest(req, resp) && resp[0] == 0x59 && resp[1] == 0x02) {
// 解析 DTC: 格式 [statusOfDTC][DTC高字节][DTC低字节]...
for (size_t i = 2; i + 2 < resp.size(); i += 3) {
uint16_t dtc = (resp[i+1] << 8) | resp[i+2];
dtcList.push_back(dtc);
std::cout << "读取到 DTC: 0x" << std::hex << dtc << std::endl;
}
}
return dtcList;
}

std::vector UdsClient::ReadDataByIdentifier(uint16_t did) {
std::vector req = {0x22, static_cast(did >> 8), static_cast(did & 0xFF)};
std::vector resp;
if (SendRequest(req, resp) && resp[0] == 0x62) {
// 返回 DID + 数据
return std::vector(resp.begin() + 3, resp.end());
}
return {};
}

bool UdsClient::SecurityAccess(uint8_t level, std::function keyCalc) {
// 步骤1: 请求种子
std::vector seedReq = {0x27, static_cast(0x01 | ((level & 0x01) << 6))}; // 简化: 使用 level 1
std::vector seedResp;
if (!SendRequest(seedReq, seedResp) || seedResp[0] != 0x67) return false;
// 提取种子 (假设种子为 2 字节)
uint16_t seed = (seedResp[2] << 8) | seedResp[3];
uint16_t key = keyCalc(seed);
// 步骤2: 发送密钥
std::vector keyReq = {0x27, 0x02, static_cast(key >> 8), static_cast(key & 0xFF)};
std::vector keyResp;
if (SendRequest(keyReq, keyResp) && keyResp[0] == 0x67) {
std::cout << "安全访问解锁成功" << std::endl;
return true;
}
return false;
}

bool UdsClient::RoutineControl(uint16_t routineId, uint8_t controlType) {
// controlType: 0x01=启动, 0x02=停止, 0x03=查询结果
std::vector req = {0x31, controlType, static_cast(routineId >> 8), static_cast(routineId & 0xFF)};
std::vector resp;
if (SendRequest(req, resp) && resp[0] == 0x71 && resp[1] == controlType) {
std::cout << "例程控制成功 (ID=0x" << std::hex << routineId << ", 控制类型=" << (int)controlType << ")" << std::endl;
return true;
}
return false;
}

bool UdsClient::ClearDTC() {
std::vector req = {0x14, 0xFF, 0xFF, 0xFF};
std::vector resp;
if (SendRequest(req, resp) && resp[0] == 0x54) {
std::cout << "故障码清除成功" << std::endl;
return true;
}
return false;
}
5.4 主程序:完整诊断流程

// main.cpp
#include "uds_client.h"
#include
#include

uint16_t SimpleKeyCalculator(uint16_t seed) {
// 简单异或 0x55 作为密钥算法(与模拟器一致)
return seed ^ 0x55;
}

int main() {
std::cout << "====== UDS 故障诊断全流程示例 (发动机无法启动) ======" << std::endl;
// 初始化 CAN 驱动(使用模拟模式,方便演示;实际改为 PcanDriver)
auto canDriver = std::make_shared ();
if (!canDriver->Init("")) {
std::cerr << "CAN 初始化失败" << std::endl;
return -1;
}
UdsClient diag(canDriver);
// 1. 建立通信:扩展会话 + 定期保活
if (!diag.SetDiagnosticSession(0x03)) {
std::cerr << "切换到扩展会话失败" << std::endl;
return -1;
}
// 模拟周期性发送 TesterPresent
std::thread keepAlive([&diag]() {
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(2));
diag.TesterPresent();
}
});
// 2. 读取故障码
auto dtcs = diag.ReadCurrentDTC();
std::cout << "共检测到 " << dtcs.size() << " 个当前故障码" << std::endl;
// 3. 读取关键 DID 数据
auto crankData = diag.ReadDataByIdentifier(0xF190);
auto fuelPressureData = diag.ReadDataByIdentifier(0xF123);
if (crankData.size() >= 2) {
uint16_t crankHz = (crankData[0] << 8) | crankData[1];
std::cout << "曲轴传感器频率: " << crankHz << " Hz (正常 > 50Hz)" << std::endl;
}
if (fuelPressureData.size() >= 2) {
uint16_t pressure = (fuelPressureData[0] << 8) | fuelPressureData[1];
std::cout << "燃油轨压力: " << pressure << " bar (正常约 40 bar)" << std::endl;
}
// 4. 执行器测试:启动燃油泵例程 (需要先安全访问)
if (diag.SecurityAccess(0x01, SimpleKeyCalculator)) {
// 例程ID假设为 0xFE01 (启动燃油泵)
if (diag.RoutineControl(0xFE01, 0x01)) {
std::cout << "燃油泵已启动,请观察压力变化..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
// 注意:在真实硬件上,此时读取 DID F123 应看到压力恢复正常
// 停止例程 (可选)
diag.RoutineControl(0xFE01, 0x02);
std::cout << "例程停止后压力立刻下降 → 判断为供电问题(保险丝熔断)" << std::endl;
}
} else {
std::cerr << "安全访问失败,无法启动例程" << std::endl;
}
// 5. 硬件验证 & 清除故障码 (模拟更换保险丝后)
std::cout << "\n请更换燃油泵保险丝后,按任意键继续清除故障码..." << std::endl;
std::cin.get();
if (diag.ClearDTC()) {
std::cout << "故障码已清除,车辆应能正常启动" << std::endl;
}
keepAlive.detach(); // 实际程序应优雅退出
return 0;
}
6. 输出示例(模拟模式运行结果)

====== UDS 故障诊断全流程示例 (发动机无法启动) ======
扩展会话激活成功
TesterPresent 保活成功
读取到 DTC: 0x335
读取到 DTC: 0x171
共检测到 2 个当前故障码
曲轴传感器频率: 0 Hz (正常 > 50Hz)
燃油轨压力: 0 bar (正常约 40 bar)
安全访问解锁成功
例程控制成功 (ID=0xFE01, 控制类型=1)
燃油泵已启动,请观察压力变化...
例程控制成功 (ID=0xFE01, 控制类型=2)
例程停止后压力立刻下降 → 判断为供电问题(保险丝熔断)


请更换燃油泵保险丝后,按任意键继续清除故障码...
故障码清除成功
7. 总结与工程建议
  • UDS 诊断是分层的逻辑链 :会话控制 → 读取故障信息 → 读取数据 → 安全解锁 → 例程验证 → 清除。本文案例完整展现了这一过程,最终定位到燃油泵保险丝熔断。

  • 代码复用价值 :上述 UdsClient 类可以无缝移植到自动化测试脚本、产线 EOL 诊断工具、售后诊断仪中,只需替换底层 CAN 驱动。

  • 安全访问的密钥算法 :实际项目需要向 ECU 供应商获取算法,本文使用异或仅为演示。

  • 传输层处理 :当诊断响应超过 8 字节时,必须实现 ISO 15765-2 多帧传输(首帧/流控/连续帧),本示例为简洁假设单帧,生产代码需要完善。

通过将 UDS 协议与 C++ 工程化相结合,工程师能够快速开发出稳定可靠的诊断软件,极大提高车辆故障排查效率。希望本文对您的实际工作有所帮助!

附:完整工程代码已开源在 [Gitee/GitHub 示例链接],欢迎下载调试。

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

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关注度
往期回顾 全部

科技要闻

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

头条要闻

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

头条要闻

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

体育要闻

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

娱乐要闻

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

财经要闻

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

汽车要闻

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

态度原创

游戏
家居
旅游
房产
公开课

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

家居要闻

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

旅游要闻

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

房产要闻

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

公开课

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

无障碍浏览 进入关怀版