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

UDS 0x22服务DID读取处理:基于AUTOSAR的SW-C与NvM数据获取深度解析

0
分享至

一、概述

在AUTOSAR架构中,UDS 0x22服务(ReadDataByIdentifier)用于通过DID从ECU读取应用数据或存储数据。DCM(Diagnostic Communication Manager)本身并不存储任何应用数据,当DCM的DID级处理函数被触发后,需要通过RTE(Run-Time Environment)调用相应的软件组件(SW-C)或基础软件模块(BSW)来获取实际数据。本文将深入解析实时动态数据和存储数据两类DID的数据获取原理,并提供C++代码实现示例。

二、DID数据的来源分类

DID数据通常分为两大类:

类型

数据示例

数据来源

读取方式

实时动态数据

车速、发动机转速、水温、油门踏板位置、车门状态

应用层SW-C周期性计算或采集

通过RTE调用SW-C的输出端口获取

存储数据

VIN码、硬件版本号、软件版本号、生产日期、配置参数

非易失性存储器(EEPROM/Flash)

通过NvM模块读取

实时动态数据反映车辆当前运行状态,具有强时效性;存储数据则持久化于NVM中。理解这一分类是正确设计DID映射配置的前提。

三、AUTOSAR工具链DID配置概述

在深入代码实现之前,首先需要理解DID在AUTOSAR工具链(如ETAS ISOLAR/Virtual PC、Vector DaVinci)中的配置流程,这是后续代码能够正确运行的基础。

配置步骤概览:

  1. CDD(CANdb++ Diagnostic Description)准备 :创建DID定义文件,配置DID标识符、数据类型、数据长度等

  2. 工具链配置

    • 在DaVinci Developer中为应用层诊断SW-C创建RAM数组(如 NvMShw_xxxx

    • 创建NvM Block Needs,配置存储属性(上电读取、下电存储等)

    • 将NvM Block与RAM数组关联

  3. 关联Client/Server接口

    • 将DCM模块的DID关联接口至应用层诊断SW-C

    • 将NvM模块的DID关联接口至应用层诊断SW-C

    • 在SWC中建立DID的Access Point

  4. 代码生成 :配置完成后,工具链会生成以下内容:

    • BSW模块的C源文件和头文件(如 Dcm.cNvM.c

    • RTE骨架代码

    • 自定义DID处理函数的框架(待开发者填充)

四、通过RTE获取实时数据——以车速DID 0x0202为例 4.1 配置映射关系

在系统工程设计中,首先需要在RTE配置工具中将DID 0x0202映射到应用层软件组件的输出端口。这通常通过以下方式实现:

  1. 在DaVinci Developer中创建SW-C的Sender-Port,定义车速数据元素的数据类型

  2. 配置DCM模块中DID 0x0202的数据源属性,将其指向上述SW-C的输出端口而非NvM存储

  3. 配置RTE数据映射,将DCM读取请求路由到对应的SW-C端口

这种设计使得DCM无需区分数据来源,RTE作为抽象层自动完成路由,极大提升了软件的复用性和可维护性。

4.2 读取流程


4.3 代码实现示例

以下代码演示了在AUTOSAR架构下,DCM如何通过RTE获取实时车速数据的完整实现。

4.3.1 应用层SW-C代码

// ============================================================================
// 文件: Sensor_SWC.h
// 描述: 应用层传感器处理软件组件头文件
// ============================================================================

#ifndef SENSOR_SWC_H
#define SENSOR_SWC_H

#include "Std_Types.h" // AUTOSAR标准类型定义
#include "Rte_Sensor_SWC.h" // RTE生成的头文件

#ifdef __cplusplus
extern "C" {
#endif

// 车速数据类型定义
typedef uint16 VehicleSpeedType; // 车速范围: 0-65535 km/h
typedef uint16 EngineSpeedType; // 发动机转速
typedef uint8 TemperatureType; // 温度值

// ============================================================================
// Runnable实体函数声明
// ============================================================================

/**
* @brief Runnable_ReadVehicleSpeed - 读取车速值
* @details 该Runnable由RTE周期性调度,从CAN驱动读取最新车速并更新到输出端口
* @param none
* @return void
*/
extern FUNC(void, SENSOR_SWC_CODE) Runnable_ReadVehicleSpeed(void);

/**
* @brief Runnable_ReadEngineSpeed - 读取发动机转速
* @details 周期性读取发动机转速值
*/
extern FUNC(void, SENSOR_SWC_CODE) Runnable_ReadEngineSpeed(void);

#ifdef __cplusplus
}
#endif

#endif /* SENSOR_SWC_H */

// ============================================================================
// 文件: Sensor_SWC.c
// 描述: 应用层传感器处理软件组件实现
// ============================================================================

#include "Sensor_SWC.h"
#include "CanIf.h" // CAN接口模块
#include "Can.h" // CAN驱动模块

/* 静态变量 - 最新数据值(RAM中的Buffer) */
static VAR(VehicleSpeedType, SENSOR_SWC_VAR) s_lastVehicleSpeed = 0U;
static VAR(EngineSpeedType, SENSOR_SWC_VAR) s_lastEngineSpeed = 0U;
static VAR(uint8, SENSOR_SWC_VAR) s_speedValidFlag = 0U; // 数据有效性标志

/* CAN接收的数据结构定义 */
typedef struct {
uint16 speed_raw; // 原始车速值
uint8 signal_quality; // 信号质量标志
} CanSpeedMsgType;

/**
* @brief Runnable_ReadVehicleSpeed - 周期间隔5ms运行
* @details 1. 通过CanIf读取CAN总线上的车速信号
* 2. 进行数据处理和有效性校验
* 3. 通过RTE接口将数据发送到输出端口
*/
FUNC(void, SENSOR_SWC_CODE) Runnable_ReadVehicleSpeed(void)
{
CanSpeedMsgType rxMsg;
VehicleSpeedType processedSpeed = 0U;
uint8 retVal = 0U;
/* 步骤1: 通过CanIf从CAN驱动读取原始报文 */
/* 假设车速报文CAN ID为0x3A0 */
retVal = CanIf_ReadRxPduData(0x3A0U, (uint8*)&rxMsg, sizeof(rxMsg));
if (retVal == E_OK)
{
/* 步骤2: 数据处理 - 原始值转换为实际物理值 */
/* 假设转换公式: 实际车速 = 原始值 * 0.1 */
if (rxMsg.signal_quality == 0x01U) /* 有效信号 */
{
processedSpeed = (VehicleSpeedType)((uint32)rxMsg.speed_raw * 10U / 100U);
s_lastVehicleSpeed = processedSpeed;
s_speedValidFlag = 1U;
}
else
{
/* 信号无效,保持上次有效值 */
s_speedValidFlag = 0U;
}
}
else
{
/* CAN读取错误,维持上次值或给默认值 */
s_speedValidFlag = 0U;
}
/* 步骤3: 通过RTE_Send接口将数据发送到输出端口 */
/* 该端口已在工具链中配置映射,连接到DCM的DID 0x0202数据源 */
(void)Rte_Send_VehicleSpeed(s_lastVehicleSpeed);
}

4.3.2 DCM DID级处理函数实现

// ============================================================================
// 文件: Dcm_DidProcessing.h
// 描述: DCM模块DID级处理函数头文件
// ============================================================================

#ifndef DCM_DID_PROCESSING_H
#define DCM_DID_PROCESSING_H

#include "Std_Types.h"
#include "Dcm_Cfg.h"

/* DCM API返回类型定义 */
#define DCM_E_OK 0x00U /* 成功完成 */
#define DCM_E_FAIL 0x01U /* 一般错误 */
#define DCM_E_PENDING 0x02U /* 异步操作进行中 */

/* 响应数据缓冲区最大长度 */
#define DID_MAX_RESPONSE_LEN 128U

/* 预定义的DID标识符 */
#define DID_VEHICLE_SPEED 0x0202U /* 实时车速 */
#define DID_VIN_CODE 0xF190U /* VIN码(标准定义) */
#define DID_HW_VERSION 0xF180U /* 硬件版本号 */
#define DID_SW_VERSION 0xF188U /* 软件版本号 */

/* DID处理函数类型定义 */
typedef uint8 (*Dcm_DidReadHandlerType)(uint8* dataBuffer, uint16* dataLength);

/**
* @brief Dcm_ReadDid_VehicleSpeed - 处理车速DID 0x0202的读取
* @param dataBuffer - 输出缓冲区指针,用于存放读取的数据
* @param dataLength - 输出数据长度指针
* @return 执行状态码
*/
extern FUNC(uint8, DCM_CODE) Dcm_ReadDid_VehicleSpeed(uint8* dataBuffer, uint16* dataLength);

#endif /* DCM_DID_PROCESSING_H */

// ============================================================================
// 文件: Dcm_DidProcessing.c
// 描述: DCM模块DID级处理函数实现
// ============================================================================

#include "Dcm_DidProcessing.h"
#include "Rte_Dcm.h" /* RTE头文件,包含Rte_Read_SWC接口 */
#include "SchM_Dcm.h"

/**
* @brief Dcm_ReadDid_VehicleSpeed - 处理车速DID 0x0202的读取
* @details
* 1. 通过RTE_Read接口获取SW-C提供的最新车速值
* 2. 将收到的数据封装到数据缓冲区中
* 3. 设置数据长度返回给DCM上层处理
*/
FUNC(uint8, DCM_CODE) Dcm_ReadDid_VehicleSpeed(uint8* dataBuffer, uint16* dataLength)
{
VehicleSpeedType speedValue = 0U;
uint8 retStatus = DCM_E_OK;
/* 参数有效性检查 - MISRA C规范要求 */
if ((NULL_PTR == dataBuffer) || (NULL_PTR == dataLength))
{
return DCM_E_FAIL;
}
/* 通过RTE接口读取SW-C中的车速数据 */
/* Rte_Read_VehicleSpeed已在工具链配置时生成 */
if (Rte_Read_VehicleSpeed(&speedValue) == RTE_E_OK)
{
/* 将车速值以小端序格式写入响应缓冲区 */
/* 车速数据长度为2字节 */
dataBuffer[0U] = (uint8)(speedValue & 0xFFU); /* 低字节 */
dataBuffer[1U] = (uint8)((speedValue >> 8U) & 0xFFU); /* 高字节 */
*dataLength = 2U;
retStatus = DCM_E_OK;
}
else
{
/*
* RTE读取失败时的错误处理:
* 返回NRC 0x22 - 条件不满足
*/
retStatus = DCM_E_FAIL;
}
return retStatus;
}

4.3.3 DCM配置回调注册

// ============================================================================
// 文件: Dcm_Cfg.c
// 描述: DCM启动配置与DID回调映射(由工具链自动生成框架,开发者填充)
// ============================================================================

#include "Dcm_Cfg.h"
#include "Dcm_DidProcessing.h"

/* DID处理函数表 */
/* 该结构体由配置工具自动生成,开发者需要将自定义处理函数填充到对应DID条目 */
const Dcm_DidReadHandlerType Dcm_DidReadHandlerTable[][2] = {
/* {DID值, 处理函数指针} */
{DID_VEHICLE_SPEED, Dcm_ReadDid_VehicleSpeed}, /* 0x0202 - 实时车速 */
{DID_VIN_CODE, Dcm_ReadDid_VinCode}, /* 0xF190 - VIN码 */
{DID_HW_VERSION, Dcm_ReadDid_HardwareVersion}, /* 0xF180 - 硬件版本 */
/* 更多的DID条目根据需要添加 */
};

/* DCM主控逻辑接收到0x22服务请求时,框架层代码会查找该表 */
uint8 Dcm_DispatchReadDidRequest(uint16 did, uint8* responseBuffer, uint16* responseLen)
{
uint8 idx;
for (idx = 0U; idx < NUM_OF_HANDLERS; idx++)
{
if (Dcm_DidReadHandlerTable[idx][0] == did)
{
if (Dcm_DidReadHandlerTable[idx][1] != NULL_PTR)
{
return ((Dcm_DidReadHandlerTable[idx][1])(responseBuffer, responseLen));
}
else
{
return DCM_E_FAIL; /* 空函数指针 */
}
}
}
return DCM_E_FAIL; /* 未找到对应的DID */
}
五、通过NvM获取存储数据——以VIN码DID 0xF190为例 5.1 配置存储映射

VIN码等存储数据的配置需要在工具链中建立DID到NvM Block的映射:

  1. 在DaVinci Developer中为诊断SW-C创建NvData类型的接口,定义VIN码结构体

  2. 配置NvM Block Descriptor,指定RAM Block大小(如17字节存储VIN码)、存储属性(立即存储或周期存储)

  3. 在执行NvM_ReadAll接口的初始化阶段,将Flash中的VIN码数据同步到RAM Mirror

  4. DCM的DID配置中标记数据来源为 NvM_SERVICE ,设置对应的NvM块ID;这样在运行时,DCM级处理函数会调用 NvM_ReadBlock 而非 Rte_Read ,实现通过存储管理块(而非实时RTE)读取持久数据

5.2 NvM数据操作模型


在AUTOSAR NvM架构中:

  1. Nv Block :实际存储在EEPROM或Flash中的数据

  2. RAM Block :上电读取时的数据镜像,便于快速访问

  3. Immediate Block :用于Crash Data,具有最高优先级(优先级0),发生事件时必须立即写入存储,不能被延迟

5.3 同步机制的选择

NvM提供两种数据同步访问方式:

同步方式

特点

适用场景

隐式同步

应用与NvM共享RAM Block,应用直接读写RAM,NvM负责与NVM的数据同步

对响应时间敏感,实时性要求高的读取场景

显式同步

应用需显式调用NvM_ReadBlock/NvM_WriteBlock发起读写请求

对数据一致性要求严格,或处理大块数据的场景


5.4 读取流程


5.5 代码实现示例

5.5.1 NvM Block配置结构(BSW层配置)

// ============================================================================
// 文件: NvM_Cfg.h
// 描述: NvM模块配置定义(由工具链生成,可手工修改)
// ============================================================================

#ifndef NVM_CFG_H
#define NVM_CFG_H

#include "Std_Types.h"

/* 定义NvM块ID */
#define NVM_BLOCK_ID_VIN 0x01U /* VIN码块ID */
#define NVM_BLOCK_ID_HW_VERSION 0x02U /* 硬件版本块ID */
#define NVM_BLOCK_ID_SW_VERSION 0x03U /* 软件版本块ID */
#define NVM_BLOCK_ID_CALIB_DATA 0x04U /* 标定数据块ID */

/* VIN码存储定义(17位字符 + 1字节结束符) */
#define VIN_DATA_LENGTH 18U
#define VIN_STANDARD_LENGTH 17U /* 标准VIN码长度 */

/* NvM块属性配置 */
typedef struct {
uint16 blockId; /* 块标识符 */
uint16 blockSize; /* 数据长度(字节) */
uint8 priority; /* 优先级(0最高,255最低) */
boolean isImmediate; /* 是否为立即块(Crash Data) */
boolean readAllInit; /* 是否上电自动读取 */
} NvM_BlockConfigType;

/* 实际NvM块配置表(由BSW配置工具生成) */
const NvM_BlockConfigType NvM_BlockConfigTable[] = {
{NVM_BLOCK_ID_VIN, VIN_DATA_LENGTH, 10U, FALSE, TRUE},
{NVM_BLOCK_ID_HW_VERSION, 16U, 20U, FALSE, TRUE},
{NVM_BLOCK_ID_SW_VERSION, 32U, 20U, FALSE, TRUE},
{NVM_BLOCK_ID_CALIB_DATA, 256U, 5U, FALSE, TRUE}
};

#endif /* NVM_CFG_H */

5.5.2 NvM回调函数实现

// ============================================================================
// 文件: NvM_Callbacks.c
// 描述: NvM模块回调函数实现
// ============================================================================

#include "NvM_Callbacks.h"
#include "NvM.h"
#include "Dcm.h"

/* 异步读取状态结构体 */
typedef struct {
uint16 requestedDid; /* 请求的DID */
uint8 responseBuffer[DID_MAX_RESPONSE_LEN]; /* 响应缓冲区 */
uint16 responseLen; /* 实际数据长度 */
boolean pending; /* 异步请求进行中标志 */
} NvM_AsyncReadContextType;

/* 全局异步读取上下文 */
static VAR(NvM_AsyncReadContextType, NVM_VAR) s_asyncReadCtx;

/* VIN码数据RAM Mirror */
static VAR(uint8, NVM_VAR) s_vinData[VIN_DATA_LENGTH] = {0U};

/**
* @brief Dcm_ReadDid_VinCode - VIN码DID处理函数
* @details 通过NvM_ReadBlock发起异步读取请求
*/
FUNC(uint8, DCM_CODE) Dcm_ReadDid_VinCode(uint8* dataBuffer, uint16* dataLength)
{
NvM_RequestResultType result;
/* 参数校验 */
if ((NULL_PTR == dataBuffer) || (NULL_PTR == dataLength))
{
return DCM_E_FAIL;
}
/* 检查是否已经有正在进行的异步读取请求 */
if (s_asyncReadCtx.pending == TRUE)
{
/* 异步读取进行中,根据NvM规范返回E_PENDING */
/* DCM框架层会等待回调完成后再组装响应 */
return DCM_E_PENDING;
}
/* 保存上下文信息 */
s_asyncReadCtx.requestedDid = DID_VIN_CODE;
s_asyncReadCtx.pending = TRUE;
/*
* 发起NvM异步读取请求
* NvM_ReadBlock原型: uint8 NvM_ReadBlock(NvM_BlockIdType BlockId, void* BufferPtr)
* 该API将读取请求放入异步队列,完成时自动调用注册的回调函数
*/
result = NvM_ReadBlock(NVM_BLOCK_ID_VIN, (void*)&s_vinData[0]);
if (result == NVM_REQ_OK)
{
/*
* 请求已成功提交,数据暂未返回
* NvM完成读取后会调用回调函数NvM_ReadVinCallback
* 此处返回E_PENDING,DCM等待回调完成后再回复客户端
*/
return DCM_E_PENDING;
}
else if (result == NVM_REQ_PENDING)
{
/* 请求已在队列中,等待处理 */
return DCM_E_PENDING;
}
else
{
/* 请求失败,清除pending标志 */
s_asyncReadCtx.pending = FALSE;
return DCM_E_FAIL;
}
}

/**
* @brief NvM_ReadVinCallback - NvM读取完成回调函数
* @details
* 1. 当NvM_ReadBlock异步读取操作完成后,NvM模块会调用此回调
* 2. 在回调中将读取到的数据复制到响应缓冲区
* 3. 通知DCM模块继续完成响应发送
*/
FUNC(void, NVM_CODE) NvM_ReadVinCallback(NvM_BlockIdType BlockId, NvM_RequestResultType Result)
{
uint8* dataBuffer = NULL_PTR;
uint16 dataLength = 0U;
/* 检查块ID是否正确 */
if (BlockId != NVM_BLOCK_ID_VIN)
{
return;
}
if (Result == NVM_REQ_OK)
{
/* 读取成功,获取DCM的响应缓冲区指针 */
if (Dcm_GetResponseBuffer(&dataBuffer, &dataLength) == E_OK)
{
/* 将VIN码数据复制到DCM响应缓冲区,并设置数据长度 */
(void)memcpy(dataBuffer, s_vinData, VIN_STANDARD_LENGTH);
/* DCM模块完成正响应帧组装 */
Dcm_SendPositiveResponse(DID_VIN_CODE, dataBuffer, VIN_STANDARD_LENGTH);
}
}
else
{
/* 读取失败,需要填充否定响应(NRC 0x22: 条件不满足) */
uint8 nrc = 0x22U;
Dcm_SendNegativeResponse(DID_VIN_CODE, nrc);
}
/* 清除pending标志 */
s_asyncReadCtx.pending = FALSE;
}

5.5.3 NvM初始化与周期调度实现

// ============================================================================
// 文件: NvM_SchM.c
// 描述: NvM模块初始化与周期性任务调度(由SchM配置工具编排集成)
// ============================================================================

#include "SchM_NvM.h"
#include "NvM.h"
#include "NvM_Callbacks.h"

/* 注册回调函数到NvM模块 */
FUNC(void, NVM_CODE) NvM_InitCallbacks(void)
{
/* 注册异步读取完成回调 - NvM配置中以ServicePort形式映射到相应回调入口 */
/* 实际框架调用方式:NvM_SetReadCallback(NVM_BLOCK_ID_VIN, NvM_ReadVinCallback); */
}

/**
* @brief NvM_MainFunction - NvM主调度函数
* @details
* 该函数需要周期性地被SchM(System Clock Manager)调用。
* 它以固定的时间间隔(例如10ms)运行,负责:
* 1. 从异步任务队列中取出读写请求并执行
* 2. 处理基于优先级的任务调度
* 3. 在上电阶段执行NvM_ReadAll将数据从NVM同步到RAM Mirror
* 4. 在需要时将RAM Mirror中的数据写回NVM(WriteAll或WriteBlock)
* 5. 检查CRC校验,管理数据完整性
* 6. 处理错误并触发相应的回调
*/
FUNC(void, NVM_CODE) NvM_MainFunction(void)
{
/* 调用NvM模块主函数,处理队列中的请求 */
NvM_MainFunction_Internal();
}
六、响应发送与各层报文字段说明

DID级处理函数将数据返回后,DCM主状态机会触发响应发送流程:

  1. DCM层 :DCM将已通过PduR注册的Tx回调与响应数据组装成I-PDU,调用 PduR_DcmTransmit

  2. PduR层 :根据配置的路由表确定目的地(通常是CanTp或直接发往CanIf)并转发

  3. CanTp层 :如果需要分段(N_Cro+N_Data),CanTp负责生成FF/CF/FC等N-PDU并调用 CanIf_Transmit

  4. CanIf层 :调用CAN驱动发送CAN帧到总线

以下是实际数据报文格式说明:

报文方向

报文内容(十六进制)

字段解析

请求

22 02 02

22 = SID(0x22);02 02 = DID

正响应

62 02 02 00 20

62 = SID+0x40;02 02 = DID;00 20 = 数据(32 km/h)

负响应

7F 22 31

7F = 负响应标识;22 = SID;31 = NRC(请求超出范围)


七、常见NRC处理

NRC

名称

触发场景

SID

数据字段

诊断仪侧含义

0x13

incorrectMessageLength

报文长度或格式错误

7F

22

请求报文长度无效

0x14

responseTooLong

响应数据超过传输层长度限制

7F

22

响应数据超过CanTp最大分段限制

0x22

conditionsNotCorrect

读取数据的条件不满足(如车速条件)

7F

22

当前条件不允许读取该DID

0x31

requestOutOfRange

DID不存在或当前会话不支持

7F

22

请求的DID无效

0x33

securityAccessDenied

安全访问未解锁

7F

22

需要先通过0x27服务解锁安全等级


八、总结

本文详细解析了AUTOSAR架构下UDS 0x22服务的DID数据读取机制,重点阐述了:

  1. 数据来源分类 :实时动态数据和存储数据两大类,以及它们各自的获取方式和配置要点

  2. 实时数据读取路径 :通过RTE调用应用层SW-C的Runnable,并提供完整代码示例

  3. 存储数据读取路径 :通过NvM模块的异步读取机制,涵盖NvM Block配置、同步方式选择、回调处理与周期调度

在实际工程开发中,开发者需要借助AUTOSAR工具链(如ETAS ISOLAR/Virtual PC、Vector DaVinci、EB tresos)完成DCM、NvM、RTE等相关模块的配置,生成代码框架后,再根据本文提供的示例填充具体的数据读取逻辑。合理区分DID的数据来源类型并选择正确的数据获取路径,是确保诊断服务正确、高效运行的关键。

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

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-05-13 20:44:06
合肥市庐阳区委常委、政法委书记周茂斌接受纪律审查和监察调查

合肥市庐阳区委常委、政法委书记周茂斌接受纪律审查和监察调查

环球网资讯
2026-05-13 18:19:06
2017年,上一次特朗普访华时发生了什么?

2017年,上一次特朗普访华时发生了什么?

黔有虎
2026-05-12 23:32:05
手机号要变了:中国移动开了个头

手机号要变了:中国移动开了个头

林子说事
2026-05-12 18:37:55
这4种鱼,可能含有甲醛和重金属,建议:还是少吃比较好!

这4种鱼,可能含有甲醛和重金属,建议:还是少吃比较好!

阿龙美食记
2026-03-24 21:52:23
我50岁才悟出一个道理:凡是从不参加同学聚会、不爱发动态、不混圈子的人,十有八九在这两个方面远超常人,观察了身边上百人屡试不爽

我50岁才悟出一个道理:凡是从不参加同学聚会、不爱发动态、不混圈子的人,十有八九在这两个方面远超常人,观察了身边上百人屡试不爽

心理观察局
2026-05-08 10:35:21
28亿美元!被字节逼到无路可走的喜马拉雅终于卖给了腾讯

28亿美元!被字节逼到无路可走的喜马拉雅终于卖给了腾讯

传心财经
2026-05-13 17:38:12
史上最值钱航班,20万亿美元大佬,飞往中国

史上最值钱航班,20万亿美元大佬,飞往中国

科技每日推送
2026-05-13 20:06:14
事态失控!女星白鹿突然掉20万粉,评论区炸锅网友为李晨鸣不平

事态失控!女星白鹿突然掉20万粉,评论区炸锅网友为李晨鸣不平

胡一舸南游y
2026-05-13 13:54:27
善恶有报,移居英国仅2年,57岁吴秀波再迎噩耗,步入李易峰后尘

善恶有报,移居英国仅2年,57岁吴秀波再迎噩耗,步入李易峰后尘

有范又有料
2025-12-17 14:54:06
俄军前线失控,指挥瘫痪、军头林立,1917年式危机阴影重现。

俄军前线失控,指挥瘫痪、军头林立,1917年式危机阴影重现。

高博新视野
2026-05-13 07:30:17
官方:巴黎圣日耳曼将在对朗斯比赛中身穿Labubu联名球衣出战

官方:巴黎圣日耳曼将在对朗斯比赛中身穿Labubu联名球衣出战

懂球帝
2026-05-13 22:27:45
转账5千要查祖宗,内鬼卷走1800万却一路绿灯!银行双标太离谱了

转账5千要查祖宗,内鬼卷走1800万却一路绿灯!银行双标太离谱了

今朝牛马
2026-05-06 21:00:56
钱更难挣了!送面条老板哭诉每天送货量减半,旁边一大排店面空置

钱更难挣了!送面条老板哭诉每天送货量减半,旁边一大排店面空置

火山詩话
2026-05-12 13:45:35
3900 万!曼联要签下自己的罗德里,红魔真核彻底留不住了

3900 万!曼联要签下自己的罗德里,红魔真核彻底留不住了

奶盖熊本熊
2026-05-14 01:00:28
女学霸发明“咯噔字体”,老师低分警告:别用个性挑战考试底线

女学霸发明“咯噔字体”,老师低分警告:别用个性挑战考试底线

蝴蝶花雨话教育
2026-05-07 00:05:04
陪玩陪睡根本不够!认干爹、舔手指,背地里的阴暗面完全藏不住了

陪玩陪睡根本不够!认干爹、舔手指,背地里的阴暗面完全藏不住了

杰丝聊古今
2026-05-03 13:35:27
女子推搡哨兵后续:知情人爆料,官媒发声,恐不止坐牢这么简单

女子推搡哨兵后续:知情人爆料,官媒发声,恐不止坐牢这么简单

坠入二次元的海洋
2026-05-13 16:27:16
2026最扎心现实:1270 万毕业生里,没背景没人脉的孩子才真的难

2026最扎心现实:1270 万毕业生里,没背景没人脉的孩子才真的难

职场资深秘书
2026-05-13 21:35:02
中国“捡钱”时代或将来临:如果手中只有10万,试试死啃这两条线

中国“捡钱”时代或将来临:如果手中只有10万,试试死啃这两条线

美食格物
2026-05-13 14:03:12
2026-05-14 02:35:00
新能源自动驾驶 incentive-icons
新能源自动驾驶
专注于半导体行业资讯
975文章数 347关注度
往期回顾 全部

科技要闻

阿里年营收首破万亿,AI终于不再是画大饼

头条要闻

女子闪婚获千万房产99%份额闪离后起诉分割 法院判了

头条要闻

女子闪婚获千万房产99%份额闪离后起诉分割 法院判了

体育要闻

14年半,74万,何冰娇没选那条更安稳的路

娱乐要闻

白鹿掉20万粉,网友为李晨鸣不平

财经要闻

美国总统特朗普抵达北京

汽车要闻

C级纯电轿跑 吉利银河"TT"申报图来了

态度原创

游戏
旅游
家居
公开课
军事航空

LOL迎来史诗级改动,GEN被削废T1获利!GEN老板:为谁改的版本?

旅游要闻

四大入口协同发力 让外国游客“丝滑”逛北京

家居要闻

内在自叙,无域有方

公开课

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

军事要闻

沙特被指3月曾对伊朗发动多次“报复性”空袭

无障碍浏览 进入关怀版