CAN/FD CAN总线配置 最新详解 包含理论+实战(附带源码)

news2025/4/11 19:32:29

看前须知:本篇文章不会说太多理论性的内容(重点在理论结合实践),顾及实操,应用,一切理论内容支撑都是为了后续实际操作进行铺垫,重点在于读者可以看完文章应用。(也为节约读者时间,节约学习时间成本)

一、理论部分

CAN总线(Controller Area Network Bus)控制器局域网总线
CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域


CAN硬件电路

每个设备通过CAN收发器挂载在CAN总线网络上

CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连

(xCAN_TX直连CAN收发器TX,同理RX如此)

高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻

(避免回波反射的作用)

低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻

(类IIC有着上拉的作用)


CAN电平标准


CAN总线特征
两根通信线(CAN_H、CAN_L),线路少
差分信号通信,抗干扰能力强
高速CAN(ISO11898):125k~1Mbps, <40m
低速CAN(ISO11519):10k~125kbps, <1km
异步,无需时钟线,通信速率由设备各自约定
半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序
11位/29位报文ID,用于区分消息功能,同时决定优先级
可配置1~8字节的有效载荷
可实现广播式请求式两种传输方式
应答、CRC校验、位填充、位同步、错误处理等特性

帧类型

用途

数据帧

发送设备主动发送数据(广播式)

遥控帧

接收设备主动请求数据(请求式)

错误帧

某个设备检测出错误时向其他设备通知错误

过载帧

接收设备通知其尚未做好接收准备

帧间隔

用于将数据帧及遥控帧与前面的帧分离开

字段经典CAN (CAN 2.0)FDCAN
SOF(Start of Frame)帧起始帧起始
ID(Identifier)11位/29位11位/29位
RTR(Remote Transmission Request)远程请求位仅在经典CAN模式下有效
IDE(Identifier Extension)扩展标志位扩展标志位
SRR(Substitute Remote Request)替代RTR替代RTR
r0/r1(Reserve)1位保留2位保留
FDF(Flexible Data-rate Format)指示是否为FDCAN帧
BRS(Bit Rate Switching)指示数据段是否使用更高波特率
DLC(Data Length Code)4位(支持0~8字节)4位(支持0~64字节)
Data0~8 字节0~64 字节
CRC(Cyclic Redundancy Check)15/17位17/21位
ACK(Acknowledgement)应答位应答位
CRC/ACK界定符为ACK前后提供时间为ACK前后提供时间
EOF(End of Frame)帧结束帧结束

遥控帧

遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同

错误帧

总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备

过载帧

当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失

帧间隔

将数据帧和遥控帧与前面的帧分离开

位填充

发送方 每发送 5 个连续相同电平位(0 或 1)后,自动插入 1 个相反电平的填充位
接收方 在收到数据时,会检测并移除填充位,恢复原始数据流。

即将发送的原始数据实际发送的数据(填充后)接收后移除填充
1000001101000001110100000110
10000011110100000111110010000011110
01111111111100111110111110100111111111110

FDCAN(Flexible Data-rate CAN)是CAN总线的升级版本,旨在提高数据传输速度和数据负载能力。它兼容经典CAN(CAN2.0),同时提供更高效的通信性能,使其在汽车电子、工业控制、机器人等领域得到广泛应用。

CAN 2.0 发送 RTR 位明确帧类型:数据帧( RTR 为显性)或远程帧( RTR 为隐性)。
CAN-FD 只支持数据帧,因此总是发送显性 RRS (预留)。
相较于 CAN 2.0 CAN-FD 帧中的控制场增加了三个新的位:
扩展数据长度( EDL )位:若为隐性,表示帧为 CAN-FD 帧;否则,此位为显性(称为 R0 )(在 CAN 2.0 帧中)
比特率切换( BRS ):指示是否启用了两个比特率(例如,在用不同于仲裁阶段的比特率发送数据阶段时)
错误状态指示位( ESI ):指示节点处于错误主动模式还是错误被动模式

FDCAN 主要特性

更高的数据速率

最高可达 8Mbps(相比经典CAN的1Mbps有大幅提升)。

更大的数据负载

经典CAN最大数据长度:8字节

FDCAN最大数据长度:64字节

更高效的协议

采用 位速率切换(BRS, Bit Rate Switching):允许在数据段提升传输速率,提高吞吐量。

改进的错误检测机制:包括Cyclic Redundancy Check(CRC)增强,提高数据可靠性。

兼容性

向下兼容 经典CAN,可与CAN 2.0设备共存。

可以混合经典CAN和FDCAN设备,确保平滑升级。

FDCAN的帧格式,FDCAN与经典CAN的帧结构类似,但在数据段长度和速率切换上有所不同:

标准帧格式(11-bit 标准 ID)

扩展帧格式(29-bit 扩展 ID)

数据字段可变(8~64 字节)

位速率切换(BRS) 用于在数据段加速传输

字段说明
帧起始(SOF)表示帧开始
标识符(ID)11位/29位
控制字段指示数据长度、BRS、FDF(FDCAN帧标识)等
数据字段可变长度(0~64字节)
CRC 校验用于错误检测
确认字段其他节点发送ACK
帧结束结束标识

标识符过滤器

每个过滤器单元由 4 个关键控制位 + 2 个 32 位寄存器(R1 和 R2)组成:

配置项作用说明
FSCx(Filter Scale,位宽设置)选择过滤器位宽0:16 位模式(适用于 标准 ID)。
1:32 位模式(适用于 扩展 ID)。
FBMx(Filter Mode,模式设置)选择过滤模式0:屏蔽模式(Mask Mode)。
1:列表模式(List Mode)。
FFAx(Filter FIFO Assignment,关联 FIFO)指定接收 FIFO0:匹配的消息进入 FIFO 0
1:匹配的消息进入 FIFO 1
FACTx(Filter Activation,激活设置)启用或禁用过滤器0:过滤器禁用(不使用)。
1:过滤器启用(使用)。

标准 ID,屏蔽模式,匹配 0x100 ~ 0x1FF

FDCAN_FilterTypeDef sFilterConfig;
sFilterConfig.IdType = FDCAN_STANDARD_ID;  // 标准 ID(11-bit)
sFilterConfig.FilterIndex = 0;             // 过滤器索引 0
sFilterConfig.FilterType = FDCAN_FILTER_MASK; // 屏蔽模式
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; // 关联 FIFO 0
sFilterConfig.FilterID1 = 0x100; // 基准 ID
sFilterConfig.FilterID2 = 0x700; // 掩码(低 8 位可变)

if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
{
    Error_Handler();
}

扩展 ID,列表模式,匹配 0x12345678

sFilterConfig.IdType = FDCAN_EXTENDED_ID;  // 扩展 ID(29-bit)
sFilterConfig.FilterIndex = 1;             // 过滤器索引 1
sFilterConfig.FilterType = FDCAN_FILTER_LIST; // 列表模式
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1; // 关联 FIFO 1
sFilterConfig.FilterID1 = 0x12345678; // 仅允许此 ID
sFilterConfig.FilterID2 = 0x00000000; // 备用

if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
{
    Error_Handler();
}

FDCAN 具有 两个接收 FIFO(FIFO 0 和 FIFO 1):

FIFO 0:通常用于 高优先级消息。

FIFO 1:用于 低优先级或非关键消息。

在过滤器配置时:

FFAx = 0:匹配的消息存入 FIFO 0。

FFAx = 1:匹配的消息存入 FIFO 1。

过滤器的激活

所有过滤器在默认情况下 禁用(FACTx=0),需要手动激活:

HAL_FDCAN_Start(&hfdcan1);

如果需要修改过滤器,先禁用,再重新配置

HAL_FDCAN_Stop(&hfdcan1);
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);
HAL_FDCAN_Start(&hfdcan1);

测试模式

静默模式:用于分析CAN总线的活动,不会对总线造成影响

hfdcan1.Init.Mode = FDCAN_MODE_BUS_MONITORING; // 设为静默模式
HAL_FDCAN_Init(&hfdcan1);

环回模式:用于自测试,同时发送的报文可以在CAN_TX引脚上检测到

hfdcan1.Init.Mode = FDCAN_MODE_INTERNAL_LOOPBACK; // 设为环回模式
HAL_FDCAN_Init(&hfdcan1);

环回静默模式:用于热自测试,自测的同时不会影响CAN总线

hfdcan1.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK; // 设为环回静默模式
HAL_FDCAN_Init(&hfdcan1);

二、实操部分

下述配置可以用到相关的软件比如笔者用的这款软件。

重点说明下配置问题

#include "fdcan.h"

/* USER CODE BEGIN 0 */
//FDCAN_RxHeaderTypeDef RxHeader;
//uint8_t RxData[8];
//FDCAN_TxHeaderTypeDef TxHeader;
//uint8_t TxData[8]={0};
/* USER CODE END 0 */

FDCAN_HandleTypeDef hfdcan2;

/* FDCAN2 init function */
void MX_FDCAN2_Init(void)
{

  /* USER CODE BEGIN FDCAN2_Init 0 */

  /* USER CODE END FDCAN2_Init 0 */

  /* USER CODE BEGIN FDCAN2_Init 1 */

  /* USER CODE END FDCAN2_Init 1 */
  hfdcan2.Instance = FDCAN2;
  hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1;
  hfdcan2.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
  hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;
  hfdcan2.Init.AutoRetransmission = DISABLE;
  hfdcan2.Init.TransmitPause = DISABLE;
  hfdcan2.Init.ProtocolException = DISABLE;
  hfdcan2.Init.NominalPrescaler = 4;
  hfdcan2.Init.NominalSyncJumpWidth = 4;
  hfdcan2.Init.NominalTimeSeg1 = 31;
  hfdcan2.Init.NominalTimeSeg2 = 8;
  hfdcan2.Init.DataPrescaler = 2; 
  hfdcan2.Init.DataSyncJumpWidth = 4;
  hfdcan2.Init.DataTimeSeg1 = 11;
  hfdcan2.Init.DataTimeSeg2 = 4;
  hfdcan2.Init.StdFiltersNbr = 0;
  hfdcan2.Init.ExtFiltersNbr = 0;
  hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
  if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN FDCAN2_Init 2 */

  /* USER CODE END FDCAN2_Init 2 */

}

void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(fdcanHandle->Instance==FDCAN2)
  {
  /* USER CODE BEGIN FDCAN2_MspInit 0 */

  /* USER CODE END FDCAN2_MspInit 0 */

  /** Initializes the peripherals clocks
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
    PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      Error_Handler();
    }

    /* FDCAN2 clock enable */
    __HAL_RCC_FDCAN_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**FDCAN2 GPIO Configuration
    PB6     ------> FDCAN2_TX
    PB5     ------> FDCAN2_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN FDCAN2_MspInit 1 */

  /* USER CODE END FDCAN2_MspInit 1 */
  }
}

void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle)
{

  if(fdcanHandle->Instance==FDCAN2)
  {
  /* USER CODE BEGIN FDCAN2_MspDeInit 0 */

  /* USER CODE END FDCAN2_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_FDCAN_CLK_DISABLE();

    /**FDCAN2 GPIO Configuration
    PB6     ------> FDCAN2_TX
    PB5     ------> FDCAN2_RX
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_5);

  /* USER CODE BEGIN FDCAN2_MspDeInit 1 */

  /* USER CODE END FDCAN2_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
//void FDCAN2_Config(void) 
//{
//	FDCAN_FilterTypeDef sFilterConfig;
//	
//	sFilterConfig.IdType = FDCAN_STANDARD_ID;
//	sFilterConfig.FilterIndex = 0;
//	sFilterConfig.FilterType = FDCAN_FILTER_MASK;
//	sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
//	sFilterConfig.FilterID1 = 0x000;
//	sFilterConfig.FilterID2 = 0x000;
//	if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
//  {
//		Error_Handler();
//  }
//	
//	sFilterConfig.IdType = FDCAN_EXTENDED_ID;
//	sFilterConfig.FilterIndex = 0;
//	sFilterConfig.FilterType = FDCAN_FILTER_RANGE;
//	sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
//	sFilterConfig.FilterID1 = 0x00000000;
//	sFilterConfig.FilterID2 = 0x1FFFFFFF;
//	if (HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig) != HAL_OK)
//	{
//		Error_Handler();
//	}
//	
//	if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan2, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
//	{
//		Error_Handler();
//	}
//	
//	if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)//启动CAN
//	{
//		Error_Handler();
//	}
//	
//	if (HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)//设置中断使能
//	{
//		Error_Handler();
//	}
//	TxHeader.Identifier = 0x000; 
//  TxHeader.IdType = FDCAN_STANDARD_ID;	
//  TxHeader.TxFrameType = FDCAN_DATA_FRAME;      
//  TxHeader.DataLength = FDCAN_DLC_BYTES_8;
//  TxHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
//  TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
//  TxHeader.FDFormat = FDCAN_CLASSIC_CAN;          
//  TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;  
//  TxHeader.MessageMarker = 0;
//	
//	//HAL_FDCAN_Start(&hfdcan2); 滤波器后方已经配置
//}
/* USER CODE END 1 */
txHeader.Identifier = 0x123;  // 设置消息标识符
txHeader.IdType = FDCAN_STANDARD_ID;
txHeader.TxFrameType = FDCAN_DATA_FRAME;  // 设置为数据帧
txHeader.DataLength = FDCAN_DLC_BYTES_64;  
txHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;  
txHeader.BitRateSwitch = FDCAN_BRS_ON;  
txHeader.FDFormat = FDCAN_FD_CAN; //FDCAN_FD_CAN
txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
txHeader.MessageMarker = 0;  // 消息标记

 代码内容就分析到这,更多问题可以联系博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MoE Align Sort在医院AI医疗领域的前景分析(代码版)

MoE Align & Sort技术通过优化混合专家模型(MoE)的路由与计算流程,在医疗数据处理、模型推理效率及多模态任务协同中展现出显著优势,其技术价值与应用意义从以下三方面展开分析: 一、方向分析 1、提升医疗数据处理效率 在医疗场景中,多模态数据(如医学影像、文本…

【已解决】Webstorm 每次使用 git pull/push 都要输入令牌/密码登录

解决办法&#xff1a;勾上【使用凭据帮助程序】&#xff08;英文&#xff1a;Use credential helper&#xff09;

软路由安装指南

1.openwrt下载 : 选择合适的安装包,我用的软路由CPU主板是j3160,属于X86_64架构,所以筛选的时候使用X86_64的安装镜像 openwrt的官方地址可能国内打不开,需要科学上网 openwrt安装镜像下载地址 我准备用U盘引导小主机开机,进而安装openwrt操作系统,所以下载 .img.gz 文…

3500 阶乘求和

3500 阶乘求和 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;2023、思维、省赛 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {public static void main(String[] args) {long sum 0;for(int i1;i<50;i) { // 之后取模都相等su…

软件工程(应试版)图形工具总结(二)

遇到的问题&#xff0c;都有解决方案&#xff0c;希望我的博客能为你提供一点帮助。 教材参考《软件工程导论&#xff08;第六版&#xff09;》 七、 层次图&#xff08;H图&#xff09;与HIPO图 1、概述 1.1、层次图&#xff08;Hierarchy Chart / H图&#xff09; ​核心…

思维链、思维树、思维图与思维森林在医疗AI编程中的应用蓝图

在医疗AI编程中,思维链(Chain of Thought, CoT)、思维树(Tree of Thoughts, ToT)、思维图(可能指知识图谱或逻辑图)以及思维森林(Forest-of-Thought, FoT)等技术框架通过模拟人类认知和推理过程,显著提升了AI在复杂医疗场景中的决策能力和可解释性: 1. 思维链(CoT)…

1.Qt信号与槽

本篇主要介绍信号和槽&#xff0c;如何关联信号和槽以及用QPixmap在窗口中自适应显示图片 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. 信号 一般不需要主动发送信号&#xff0c;只有自定义的一些控件才需要做信号的…

MySQL 基础入门

写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库&#xff1a; 是一个关系型数据库管理系统 。 支持SQL语…

数据分析与知识发现 论文阅读【信息抽取】

文章目录 基于知识蒸馏的半监督古籍实体抽取数据集模型实验结果 基于大语言模型的专利命名实体识别方法研究数据集评估公式实验 基于数据增强和多任务学习的突发公共卫生事件谣言识别研究数据集实验结果 参考 基于知识蒸馏的半监督古籍实体抽取 数据集 本文在有监督数据集的基…

Compose组件转换XML布局

文章目录 学习JetPack Compose资源前言&#xff1a;预览界面的实现Compose组件的布局管理一、Row和Colum组件&#xff08;LinearLayout&#xff09;LinearLayout&#xff08;垂直方向 → Column&#xff09;LinearLayout&#xff08;水平方向 → Row&#xff09; 二、相对布局 …

Linux开发工具——vim

&#x1f4dd;前言&#xff1a; 上篇文章我们讲了Linux开发工具——apt&#xff0c;这篇文章我们来讲讲Linux开发工具——vim &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&a…

Vue3学习二

认识组件的嵌套 还可以将Main中内容再划分 scoped防止组件与组件之间的样式相互污染 组件的通信 父子组件之间通信的方式 父组件传递给子组件 给传过来的内容做限制 type为传的内容的属性类型&#xff0c;required为true表示该内容是必须传的&#xff0c;default为&#xff0c…

[ deepseek 指令篇章 ]300个领域和赛道喂饭级deepseek指令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、握手问题-&#xff08;解析&#xff09;-简单组合问题&#xff08;别人叫她 鸽巢定理&#xff09;&#x1f607;&#xff0c;感觉叫高级了…

C++ | C++11知识点

前言&#xff1a; 本篇内容讲述了C11中比较重要的内容为&#xff1a;右值引用、可变参数模板、lambda表达式和包装器。 ps&#xff1a;包装器博主在另一篇文章讲述的&#xff0c;本篇文章包装器板块为原文链接。 C11知识点目录 花括号初始化自定义类型的花括号初始化内…

LeetCode 1123.最深叶节点的最近公共祖先 题解

昨天写了三题&#xff0c;今天目前为止写了一题&#xff0c;玩了会游戏稍微休息了下 先来理解一下今天的题目&#xff0c;今天的题目类型是递归遍历找最深位置&#xff0c;先通过几个样例了解一下 输入&#xff1a;root [3,5,1,6,2,0,8,null,null,7,4] 输出&#xff1a;[2,7,…

工具介绍 | SafeLLMDeploy教程来了 保护本地LLM安全部署

SafeLLMDeploy&#xff1a;保护本地大语言模型安全部署的“守护者” 在AI技术飞速发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;如GPT、DeepSeek等正以前所未有的方式改变着我们的工作和生活。然而&#xff0c;本地部署这些强大的AI系统在带来便利的同时&…

机器学习-04-分类算法-03KNN算法案例

实验名称 K近邻算法实现葡萄酒分类 实验目的 通过未知品种的拥有13种成分的葡萄酒&#xff0c;应用KNN分类算法&#xff0c;完成葡萄酒分类&#xff1b; 熟悉K近邻算法应用的一般过程&#xff1b; 通过合理选择K值从而提高分类得到正确率&#xff1b; 实验背景 本例实验…

Java 搭建 MC 1.18.2 Forge 开发环境

推荐使用 IDEA 插件 Minecraft Development 进行创建项目 创建完成后即可进行 MOD 开发。 但是关于 1.18.2 的开发教程太少&#xff0c;因此自己研究了一套写法&#xff0c;写法并非是最优的但是是探索开发MOD中的一次笔记和记录 GITHUB: https://github.com/zimoyin/zhenfa…

计算机网络知识点汇总与复习——(三)数据链路层

Preface 计算机网络是考研408基础综合中的一门课程&#xff0c;它的重要性不言而喻。然而&#xff0c;计算机网络的知识体系庞大且复杂&#xff0c;各类概念、协议和技术相互关联&#xff0c;让人在学习时容易迷失方向。在进行复习时&#xff0c;面对庞杂的的知识点&#xff0c…