当前位置: 首页 > news >正文

AutoSar 通信服务架构,CAN通信诊断详解

文章目录

      • Com(通信服务模块)
      • PDU的定义和结构
      • PDU的分类
      • IPDU Mux 模块
      • PDU R 模块(路由)
      • Bus TP 模块
      • BUS Interface
        • CanIf模块
        • LinIf模块
      • 发送数据示例(CAN报文)
      • 接收数据示例(CAN报文)
      • 通信过程中路由选择的细节
      • CAN诊断网络分层
      • CAN诊断通信过程
      • CAN TP 组帧和拆帧过程
        • 举个栗子

在这里插入图片描述

AUTOSAR(Automotive Open System Architecture)通信服务是为了简化车内ECU(电子控制单元)之间的通信而设计的。它基于多种汽车通信协议(如CAN、LIN、FlexRay等),并定义了一系列模块来组成通信协议栈。

  1. Com(通信服务模块)
  • 功能:管理和协调应用层之间的数据交换,处理信号的发送和接收。
  • 特点:支持周期性和事件驱动的通信,能够与多种底层协议(如 CAN、LIN、Ethernet)集成。
  1. PduR(PDU 路由器)
  • 功能:负责将 PDU(协议数据单元)从一个模块路由到另一个模块。
  • 特点:提供多路复用和选择功能,将输入 PDU 分配给适当的接收方,以优化数据流。
  1. CanIf(CAN 接口模块)
  • 功能:作为 CAN 网络的接口,管理 CAN 帧的发送和接收。
  • 特点:支持 CAN 设备的初始化、数据传输和错误处理,同时与其他通信模块协同工作。
  1. LinIf(LIN 接口模块)
  • 功能:提供与 LIN 网络的接口,处理 LIN 帧的发送和接收。
  • 特点:支持 LIN 网络的多种功能,包括主从模式的管理和错误检测。

最底层MCAL:提供了底层通信的驱动,比如CAN发送接收驱动,Lin发送接收驱动

Com(通信服务模块)

AUTOSAR中的通信服务模块(Com模块)是AUTOSAR架构中非常重要的一部分。它主要负责在不同速率的总线网络之间进行数据交换,并为汽车控制单元(ECU)应用软件提供统一的通信环境。

以下是Com模块的一些关键功能和特点:

  1. 功能
  • 数据交换:支持不同模块之间的数据交换,包括传感器数据、控制命令等。
  • 信号处理:管理信号的发送和接收,包括信号的格式转换和处理。
  • 信号调度:根据系统需求调度信号的发送,优化数据传输的时间和频率。
  1. 通信模式
  • 发送和接收:支持周期性和事件驱动的通信模式,允许模块根据需要发送和接收数据。
  • 数据变化通知:当信号值发生变化时,Com 模块可以通知相关的接收方,以实现即时更新。
  1. 支持的协议
  • 多协议支持:Com 模块可以与多种底层通信协议集成,例如 CAN、LIN、FlexRay 和 Ethernet。
  • 多路复用和选择:支持输入 PDU 多路复用(IPDU Mux),可以选择合适的信号源进行数据处理。
  1. 配置和可扩展性
  • 可配置性:Com 模块的行为和参数在 AUTOSAR 系统描述文件(.arxml 文件)中配置,支持灵活的信号和通信管理。
  • 模块化设计:通过模块化设计,可以根据具体应用需求进行定制和扩展。
  1. 错误处理
  • 错误检测和管理:Com 模块可以检测通信错误,并提供相应的错误管理策略,以确保系统的可靠性。
  1. 接口
  • 标准化接口:Com 模块提供标准化的接口,以便于与其他 AUTOSAR 模块(如 PduR、CanIf 等)进行交互和集成。

在AUTOSAR架构中,协议数据单元(Protocol Data Unit,PDU)是用于在不同层级之间传递数据的基本单位。PDU在AUTOSAR通信模型中负责封装和传递应用层数据,使得不同的模块和设备能够互相交换信息。

通信栈完整流程:

在这里插入图片描述

PDU的定义和结构

  • 定义:PDU是在通信网络中传输的数据单元,包含了消息的有效载荷以及额外的控制信息¹²。
  • 结构:PDU通常由两个主要部分组成:头部(Header)和有效载荷(Payload)。头部用于描述PDU的属性和参数,而有效载荷则携带了实际的数据内容²。

PDU的分类

根据功能和通信模式的不同,PDU可以分为以下几种类型:

  1. L-PDU(Link Layer PDU)

    • 数据链路层PDU:用于数据链路层的通信,包含ID、数据长度和数据¹。
  2. N-PDU(Network Layer PDU)

    • 网络层PDU:在网络层传输,包含网络层地址信息(N_AI)和协议控制信息(N_PCI),如单帧、首帧、连续帧和流控帧¹²。
  3. I-PDU(Interaction Layer PDU)

    • 交互层PDU:用于不同进程之间的数据传输,可以是周期性的或事件触发的²。

IPDU Mux 模块

在 AUTOSAR 中,IPDU Mux(Input Protocol Data Unit Multiplexer)模块用于管理和路由多种输入 PDU(协议数据单元)的接收和传输。它的主要作用是处理不同的信号和数据流,尤其是在具有多个信号源或多种数据格式的情况下

  1. 功能
  • 信号选择:根据特定条件或标志,从多个输入 PDU 中选择一个进行处理。这个条件可以是消息的 ID、数据内容或其他控制信号。
  • 路由管理:将接收到的输入 PDU 路由到相应的接收模块或应用层,以便进行进一步处理。
  1. 数据转换
  • 数据格式转换:IPDU Mux 模块可以处理不同数据格式的输入 PDU,并将其转换为统一格式,以便于上层模块处理。
  1. 多路复用
  • 资源优化:通过多路复用输入 PDU,可以有效利用网络带宽和资源,减少数据传输的冗余。
  1. 配置
  • 可配置性:IPDU Mux 模块的配置通常在 AUTOSAR 系统描述文件(如 .arxml 文件)中定义,支持灵活的信号处理和路由策略。
  1. 应用场景
  • 多种信号源:在车辆电子系统中,可能有多个传感器或控制单元发送相似或相关的数据。IPDU Mux 模块可以根据需要选择合适的信号进行处理。

PDU R 模块(路由)

PDU Router(PduR)模块是AUTOSAR架构中的关键组件,负责在不同通信网络之间传输和处理数据。它确保数据能够准确、高效地到达目的地。以下是PduR模块的一些主要功能和特点:

  • 数据路由:
    • 上层到下层:PduR模块将来自上层模块(如COM、DCM)的I-PDU传输到下层通信接口模块(如CanIf、LinIf)。
    • 下层到上层:它也将来自下层模块的I-PDU传递到上层模块。
  • 网关功能:
    • PduR模块可以作为网关,将I-PDU从一个通信接口模块传输到另一个通信接口模块。
  • 静态路由配置:
    • I-PDU的路由是基于静态定义的I-PDU标识符执行的,路由路径在预编译阶段配置。
  • 多播和单播:
    • PduR支持I-PDU的单播(1:1)和多播(1:n)传输。
  • 模块解耦:
    • 通过PduR模块,上下层模块之间实现了解耦,增强了系统的灵活性和可维护性。
      PduR模块在汽车通信架构中起到了桥梁作用,确保了不同模块之间的有效通信。

Bus TP 模块

在AUTOSAR架构中,Bus Transport Protocol(Bus TP)模块主要负责在不同通信总线(如CAN、LIN、FlexRay等)上传输大于单帧容量的数据。以下是Bus TP模块的一些关键功能和特点:

  1. 多帧传输
    • 分段传输:当数据长度超过单帧容量时,Bus TP模块将数据分段为多个帧进行传输
    • 重组数据:接收端的Bus TP模块负责将分段的帧重新组装成完整的数据包
  2. 流控制
    • 流控帧:Bus TP模块使用流控帧(Flow Control Frame)来管理数据传输的流量,确保发送端不会超出接收端的处理能力
  3. 错误检测和恢复
    • 错误检测:Bus TP模块能够检测传输过程中的错误,如帧丢失或顺序错误
    • 错误恢复:在检测到错误时,Bus TP模块会触发重传机制,以确保数据的完整性
  4. 协议支持
    • ISO 15765-2:Bus TP模块通常基于ISO 15765-2标准,用于CAN总线的诊断通信
    • 其他协议:也支持其他通信协议,如LIN和FlexRay
  5. 与其他模块的交互
    • PduR模块:Bus TP模块与PduR模块协作,确保数据能够正确路由到目标模块
    • CanIf、LinIf等接口模块:Bus TP模块通过这些接口模块与物理总线进行通信

通过这些功能,Bus TP模块在确保大数据量可靠传输方面发挥了重要作用。

BUS Interface

是的,在AUTOSAR架构中,BUS Interface主要包括CAN Interface(CanIf)和LIN Interface(LinIf)模块。以下是这两个模块的详细介绍:

CanIf模块
  1. 位置和作用
    • CanIf模块位于底层CAN驱动(CanDrv)、CAN收发器(CanTrcv)和上层通信服务层(如PduR、CanNm、CanTp)之间
    • 它提供了一个硬件独立的接口,用于管理不同的CAN硬件,如CAN控制器和CAN收发器
  2. 主要功能
    • 数据发送和接收:CanIf模块负责将上层模块的I-PDU传输到CAN总线,并接收来自CAN总线的I-PDU
    • 控制器模式管理:CanIf模块可以控制CAN控制器的启动、停止和模式切换
    • 错误处理和通知:CanIf模块能够处理CAN总线上的错误,并向上层模块发送错误通知
LinIf模块
  1. 位置和作用
    • LinIf模块作为硬件抽象接口层,屏蔽了下层LIN驱动的具体实现
    • 它位于LIN驱动(LinDrv)和上层通信服务层(如PduR、LinTp)之间
  2. 主要功能
    • 数据传输:LinIf模块负责将上层模块的I-PDU传输到LIN总线,并接收来自LIN总线的I-PDU
    • 诊断和唤醒:LinIf模块支持LIN总线的诊断功能和休眠唤醒机制
    • 错误处理:LinIf模块能够检测和处理LIN总线上的错误,并向上层模块发送错误通知

发送数据示例(CAN报文)

在 AUTOSAR 通信服务中,发送 CAN 报文的具体流程可以概括为以下几个步骤:

  1. 准备数据
  • 应用层准备数据:应用层或上层模块准备要发送的数据,并调用相应的接口进行发送。
  • 填充 PDU:将数据填充到 PDU 中,包括必要的控制信息和数据有效载荷。
  1. 调用 PDU Router (PduR)
  • 发送请求:应用层通过 PduR 调用发送接口(如 PduR_Send()),请求发送数据。
  • 路由选择:PduR 确定数据的目标(例如,CAN 或 LIN),并决定相应的传输协议(如 CanTp)。
  1. 调用 CanTp(如果需要)
  • 分段处理:如果数据超过 CAN 帧的最大长度,PduR 将数据传递给 CanTp 进行分段处理。
  • 发送分段 PDU:CanTp 将数据分段并发送每个数据块,控制每个块的传输状态和确认。
  1. 通过 CanIf 模块
  • 调用 CanIf:PduR 或 CanTp 完成分段后,将每个数据段传递给 CanIf 模块。
  • CAN 帧封装:CanIf 封装数据到 CAN 帧中,包括消息 ID 和其他控制信息。
  1. 通过 CAN 驱动发送
  • 调用 CAN 驱动:CanIf 调用底层 CAN 驱动接口(如 CanIf_Transmit()),将封装好的 CAN 帧发送到硬件。
  • 硬件发送:底层驱动将 CAN 帧发送到 CAN 总线。
  1. 确认与反馈
  • 接收确认:接收端的 CAN 控制器收到 CAN 帧后,发送确认信号,表明成功接收。
  • 处理反馈:发送端的 CAN 驱动接收到确认后,通知 CanIf 模块,更新传输状态,并可以选择进行后续的处理(如发送下一个数据段)。
  1. 完成
  • 通知应用层:一旦所有数据成功发送和确认,PduR 或相应的模块将返回结果给应用层,表明发送完成。

接收数据示例(CAN报文)

在 AUTOSAR 通信服务中,接收 CAN 报文的具体流程可以分为以下几个步骤:

  1. CAN 硬件接收
  • 接收数据:CAN 控制器监测 CAN 总线,接收到一个完整的 CAN 帧。
  • 存储数据:接收到的 CAN 帧数据被存储在硬件缓冲区中,等待处理。
  1. 调用 CAN 驱动
  • 通知 CanIf:CAN 控制器通过中断或轮询方式通知 CAN 驱动(如 CanIf 模块)有新数据可用。
  • 提取数据:CAN 驱动从硬件缓冲区提取接收到的 CAN 帧,并准备将其传递给上层模块。
  1. 通过 CanIf 处理
  • 转发报文:CanIf 将接收到的 CAN 帧转发给 PduR 模块。
  • 解封装 PDU:CanIf 解封装 CAN 帧,提取出有效载荷和其他控制信息。
  1. 调用 PDU Router (PduR)
  • 路由选择:PduR 根据目标 PDU ID 和配置,确定数据的目的地,并将数据转发给相应的接收模块(如 CanTp 或应用层)。
  • 分段处理:如果数据是通过 CanTp 进行的分段传输,PduR 会将数据传递给 CanTp 进行重组。
  1. 通过 CanTp(如果适用)
  • 重组数据:CanTp 将接收到的分段数据进行重组,确保完整性。
  • 发送到上层:完成重组后,CanTp 将完整的数据传递给 PduR。
  1. 通知应用层
  • 调用应用接口:PduR 将最终的数据传递给应用层或上层模块,调用相应的接口(如 PduR_Receive())。
  • 处理数据:应用层处理接收到的数据,执行相应的业务逻辑。
  1. 确认与反馈
  • 发送确认:根据需要,应用层可以发送确认信息或反馈,确保数据已被成功处理。

通信过程中路由选择的细节

在 AUTOSAR 通信过程中,路由选择主要通过 PDU Router (PduR) 模块进行,具体步骤如下:

  1. PDU 定义
  • 每个 PDU 在配置文件中定义,包括其 ID、数据长度和目标模块等信息。
  1. 接收报文
  • 当接收到 CAN 报文时,CanIf 模块将其转发给 PduR。
  1. 查找路由表
  • PduR 内部维护一个路由表,记录每个 PDU ID 和其对应的目标模块。
  • PduR 使用接收到的 PDU ID 在路由表中查找,确定数据的接收目标。
  1. 转发数据
  • 根据路由表中的配置,PduR 将数据转发给相应的接收模块(如应用层、CanTp 或其他通信模块)。
  • 如果需要,PduR 还会处理数据的转换(例如,格式转换或数据分段)。
  1. 处理确认
  • PduR 可能还会根据配置向发送方或其他模块发送确认信息,确保数据传输的可靠性。

CAN诊断网络分层

CAN 诊断的网络分层通常遵循 OSI 模型的分层结构,具体包括以下几个层次:

  1. 物理层
  • 功能:负责数据的物理传输,包括电气信号的发送和接收。
  • 实现:定义电缆类型、连接器和电气特性,确保信号在 CAN 总线上的稳定传输。
  1. 数据链路层
  • 功能:负责帧的组装、传输和错误检测。
  • 实现:使用 CAN 协议,定义帧格式、优先级、仲裁和错误处理机制。
  1. 网络层
  • 功能:处理数据包的路由和传输,但在 CAN 网络中通常不明显。
  • 实现:一般通过诊断会话管理和数据传输来实现,例如,UDS(统一诊断服务)通过网络层协议传输诊断消息。
  1. 传输层
  • 功能:提供可靠的数据传输,确保数据的完整性和顺序。
  • 实现:在诊断中,CAN 诊断服务(如 UDS)可以通过分段和重组功能来实现大数据块的传输。其中CAN Tp模块便是这个起作用。
  • CanTp 处理以下内容:
    • 数据分段:将较大的 PDU 分割成多个小的 CAN 帧进行传输。
    • 数据重组:在接收端将分段的 CAN 帧重新组合为完整的数据块。
    • 可靠性控制:实现数据传输的确认机制,确保数据的可靠接收。
  1. 会话层
  • 功能:管理和控制会话的建立、维护和结束。
  • 实现:通过会话管理服务(如启动会话、停止会话)来控制诊断服务的状态。
  1. 表示层
  • 功能:负责数据格式化和转换,确保不同系统之间的数据能够理解。
  • 实现:在诊断服务中,数据的编码和解码通常在此层进行。
  1. 应用层
  • 功能:提供最终用户的接口,定义具体的诊断服务。
  • 实现:实现具体的诊断功能,如故障代码读取、数据流监控、程序下载等。

在 AUTOSAR 中,通信报文和诊断报文的处理有所不同:

  1. 诊断报文
  • 经过 CanTp:诊断报文(如 UDS 报文)通常会经过 CAN Transport Protocol (CanTp) 模块。由于诊断报文可能需要传输较大的数据块,CanTp 的分段和重组功能确保能够在 CAN 网络中可靠地传输这些数据。
  1. 通信报文
  • 通常不经过 CanTp:常规的通信报文(例如,传感器数据、控制命令等)通常不需要分段,因此可以直接通过 CAN 控制器发送。通信报文的大小一般在 CAN 帧的限制范围内,不需要 CanTp 的处理。
  • 例外情况:如果某些通信报文的数据量较大并需要分段,那么它们也可能经过 CanTp。

CAN诊断通信过程

在这里插入图片描述

在 AUTOSAR 和 CAN 诊断中,诊断请求帧应答帧是用于实现诊断服务的基本消息类型。

发送方(通常是诊断工具或测试设备)向 ECU(电子控制单元)发送的请求消息。

请求特定的诊断服务或数据,例如读取故障码、执行诊断测试或请求实时数据流。

内容:

  • 服务标识符 (Service ID):指示请求的具体服务类型。
  • 数据字段:包含服务所需的参数和数据。

接收方(ECU)对诊断请求帧的回应消息。

提供请求中所要求的数据或服务的结果,例如返回读取到的故障码或执行结果。

内容:

  • 服务标识符 (Service ID):与请求帧中的服务 ID 一致,表示这是对特定请求的回应。
  • 数据字段:包含请求的结果、错误码或状态信息。

通过这两种帧,诊断工具与 ECU 之间能够实现有效的双向通信,从而获取故障信息和进行各种诊断服务。

CAN TP 组帧和拆帧过程

CAN诊断由发送端的请求和接收端的响应构成,诊断即为发送端与接收端数数据往来。有的诊断一条信息完成, 有的诊断信息需要多条信息完成。毕竟在诊断中,一条CAN消息只包含八个字节,对于一条CAN诊断信息的分段发送问题,就是网络层需要讨论的内容。

在 CANTP层,传输报文主要分为以下几类:

  1. 单帧报文 (Single Frame)
  • 定义:用于传输较小的数据,整个数据在一个帧中发送。
  • 特点:适用于数据长度在 CAN 帧大小限制内的情况,简单快速。
  1. 第一帧 (First Frame)
  • 定义:用于开始传输较大数据块的第一部分。
  • 特点:包含数据的长度信息和序列号,指示接下来会有多帧数据传输。
  1. 数据帧 (Data Frame)
  • 定义:紧随第一帧后传输的数据部分。
  • 特点:用于传输第一帧所指定的数据块的剩余部分,多个数据帧可以连续发送。
  1. 最后一帧 (Flow Control Frame)
  • 定义:用于接收方控制数据流,告知发送方可以继续发送的状态。
  • 特点:用于流量控制,指示发送方是否需要暂停或继续发送数据。

在这里插入图片描述

在 PCI(Protocol Control Information)中,包含 PDU 单元类型和消息字节长度,这两个字段对于 CAN Transport Protocol (CanTp) 的数据传输至关重要。具体理解如下:

  1. PDU 单元类型
  • 定义:PDU 单元类型指示当前传输的消息的类型,通常包括不同的报文类型,如单帧报文、第一帧、数据帧或流控制帧。
  • 功能:通过这一字段,接收方可以确定如何处理接收到的消息。例如:
    • 如果是单帧报文,接收方直接读取数据。
    • 如果是第一帧,接收方将准备接收后续的数据帧。
  1. 消息字节长度
  • 定义:消息字节长度字段指示当前 PDU 中数据的有效字节数。
  • 功能:接收方使用这一字段来了解需要处理的数据量。这对于后续的帧解析和数据重组非常重要,尤其是在处理多帧传输时,接收方需要根据字节长度来确保数据的完整性。
举个栗子

假设我们需要传输一个数据块,总长度为 150 字节。由于 CAN 帧的最大有效负载为 8 字节,CanTp 需要将这个数据块分成多帧进行传输。

数据块:0x01, 0x02, 0x03, ..., 0x96  // 共 150 字节

1.首先发送第一帧:

内容

  • PDU 单元类型:第一帧
  • 数据长度:150 字节(0x96)
  • 数据部分:0x01, 0x02, 0x03, …, 0x08 // 包含前 8 字节的数据
[PDU Type: First Frame | Length: 150 | Data: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]

2.发送后续数据帧

CanTp 会发送多个数据帧。每个数据帧将包含 8 字节数据。

数据帧 1(第二帧):

[PDU Type: Data Frame | Data: 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10]

数据帧 2(第三帧):

[PDU Type: Data Frame | Data: 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18]

数据帧 18(最后一帧):

[PDU Type: Data Frame | Data: 0x96]

3.发送流控制帧(可选)

在数据传输过程中,接收方可以发送流控制帧以控制数据流。例如,如果接收方需要处理时间,可以发送“暂停”指令。

4.重组数据

接收方在收到所有相关的数据帧后,会将它们重组为完整的数据块:

重组的数据块:0x01, 0x02, 0x03, ..., 0x96

相关文章:

  • WPS使用越来越卡顿
  • 【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL69
  • Vue 3中进行组件开发
  • vue3中< keep-alive >页面实现缓存及遇到的问题
  • OpenAI o1与GPT-4o究竟强在哪里
  • 乱改计量单位引出的问题-《分析模式》漫谈35
  • k8s搭建一主三从的mysql8集群---无坑
  • 数字化那点事:一文读懂数字孪生
  • 详解 Spring Boot 的 RedisAutoConfiguration 配置
  • ide 使用技巧与插件推荐
  • web前端(本地存储问题超过5MB不继续保存解决办法)
  • Spring Cloud Alibaba-(6)Spring Cloud Gateway【网关】
  • 网络安全中的 EDR 是什么:概述和功能
  • Leetcode Hot 100 | 543.二叉树的直径 | 递归+优化
  • python.tkinter设计标记语言(渲染6-暂停与跳过渲染)
  • 收藏网友的 源程序下载网
  • CSS 提示工具(Tooltip)
  • ECMAScript6(0):ES6简明参考手册
  • Intervention/image 图片处理扩展包的安装和使用
  • k8s如何管理Pod
  • mongo索引构建
  • React-Native - 收藏集 - 掘金
  • SegmentFault 2015 Top Rank
  • session共享问题解决方案
  • Unix命令
  • WebSocket使用
  • windows下如何用phpstorm同步测试服务器
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 每天一个设计模式之命令模式
  • 前端工程化(Gulp、Webpack)-webpack
  • 深度学习在携程攻略社区的应用
  • 树莓派 - 使用须知
  • 数组的操作
  • 用jQuery怎么做到前后端分离
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​2021半年盘点,不想你错过的重磅新书
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #git 问题failed to resolve head as a valid ref
  • #NOIP 2014# day.2 T2 寻找道路
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (03)光刻——半导体电路的绘制
  • (1)(1.13) SiK无线电高级配置(五)
  • (1)STL算法之遍历容器
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (转)3D模板阴影原理
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件