STM32F4分别驱动SN65HVD230和TJA1050进行CAN通信
目录
- 一、CAN、SN65HVD230DR
- 二、TJA1050
- 1、TJA1050 特性
- 2、TJA1050 引脚说明
- 三、硬件设计
- 1、接线说明
- 2、TJA1050 模块
- 3、SN65HVD230 模块
- 四、程序设计
- 1、CAN_Init:CAN 外设初始化函数
- 2、CAN_Send_Msg、CAN_Receive_Msg
- 五、功能展示
- 1、接线图
- 2、CAN 数据收发测试
- 六、总结
一、CAN、SN65HVD230DR
- CAN 概述
- SN65HVD230DR 说明
二、TJA1050
1、TJA1050 特性
- TJA1050 是一款 CAN 总线收发器芯片,输入电平与 3.3 V 设备兼容。
- TJA1050 专为数据速率高达 1Mbps 的应用而设计。
线路的信号传输速率是指每秒钟的电压转换次数,单位为 bps(每秒比特数)。- TJA1050 控制器局域网(CAN)收发器完全兼容 ISO 11898 标准。
- TJA1050 至少允许 110 个节点连接到总线,未上电的节点不会干扰到总线。
- TJA1050 集成了过热保护和过流保护功能。
- 如果结温超过约 165 ℃,过热保护电路通过关闭发射器来保护芯片免受损坏。当引脚 TXD 变为高电平时,发射器关闭状态会重置。当总线短路时,热保护电路尤其需要。
- 限流电路可保护芯片发射器免受意外短路至正或负电源造成的损坏,在这种故障情况下过流保护电路会限制流过的最大电流直到短路情况解除。
2、TJA1050 引脚说明
引脚名称 | 引脚说明 |
---|---|
TXD | CAN 收发器的发送输入端,通常连接到主控 MCU 的 CAN TX 引脚 |
RXD | CAN 收发器的接收输出端,通常连接到主控 MCU 的 CAN RX 引脚 |
V r e f V_{ref} Vref | VCC/2 参考输出引脚 |
S | TJA1050 的模式选择引脚 |
CANL | CAN_Low 信号线,与 CAN_High 共同构成一组差分信号线 |
CANH | CAN_High 信号线,与 CAN_Low 共同构成一组差分信号线 |
VCC | 电源正极,芯片需要 5V 电源进行供电 |
GND | 电源负极,芯片需要 5V 电源进行供电 |
- TXD 引脚是用于发送数据到 CAN 总线。
- 当 MCU 在 CAN_TX 引脚输出逻辑信号时,逻辑信号会传递到 TXD 引脚,然后 TJA1050 将逻辑信号转化为 CAN 总线的差分信号(CANH 和 CANL),最后通过 CAN 总线发送出去。
- RXD 引脚用于接收来自 CAN 总线的数据。
- CAN 总线的差分信号(CANH 和 CANL)被 TJA1050 接收后,差分信号(CANH 和 CANL)被转换为单端逻辑信号,输出到 RXD 引脚,供 MCU 的 CAN_RX 引脚读取。
- TJA1050 通过 S 引脚可以设置芯片处于两种不同的工作模式:高速模式和静音模式。
- 正常模式:该工作模式下 CAN 总线驱动器和接收器正常工作,CAN 总线双向通信。
- 静音模式:该工作模式下 CAN 驱动器关闭,CAN 接收器保持有效,RXD 可以正常输出接收到的总线数据。
- V r e f V_{ref} Vref 引脚输出 VCC/2 的参考电压,可连接到终端网络中的共模点,以帮助进一步稳定总线的共模电压。
- 如果不使用 V r e f V_{ref} Vref 引脚,可将其悬空。
三、硬件设计
1、接线说明
2、TJA1050 模块
- 模块的 S 引脚接地,模块处于高速模式。
- 模块的 V r e f V_{ref} Vref 引脚悬空。
- TJA1050 模块是一个 CAN 收发器模块,不包含内置的 CAN 控制器,因此无法独立实现 CAN 数据的接收和发送。
模块上的 RX 和 TX 引脚并非串口的 TX 和 RX 引脚,因此不能用于实现串口 TTL 转 CAN 的功能。
3、SN65HVD230 模块
- 模块的 R S R_{S} RS 引脚与地之间串联一个 1K 阻值的电阻,模块处于斜率控制模式。
- 模块的 V r e f V_{ref} Vref 引脚悬空。
- SN65HVD230 模块是一个 CAN 收发器模块,不包含内置的 CAN 控制器,因此无法独立实现 CAN 数据的接收和发送。
模块上的 RX 和 TX 引脚并非串口的 TX 和 RX 引脚,因此不能用于实现串口 TTL 转 CAN 的功能。
四、程序设计
1、CAN_Init:CAN 外设初始化函数
- 函数中,sjw、pres、ts1、ts2 这四个参数共同决定 CAN 的波特率。
- Fpclk:CAN 控制器的输入时钟频率,在 STM32 上通常为 APB1 时钟频率。
- pres:波特率分频器,决定时间量化单元(Time Quantum,简称 tq)的长度;tq 越长,波特率越低。
- ts1:时间段 1(Time Segment 1),由若干时间量化单元组成;包括传播时间段(Propagation Segment)和相位缓冲段 1(Phase Segment 1),决定信号从发送到接收节点传播的时间。
- ts2:时间段 2(Time Segment 2),由若干时间量化单元组成;包括相位缓冲段 2(Phase Segment 2),用于对信号采样点后的波动进行调整。
- +1:同步段的时间量化单元,始终固定为 1 个 tq,用于同步接收节点与发送节点的时钟。
- tq 是 CAN 定时的基本单位,其大小由 Fpclk 和 pres 决定:tq = pres * tpclk;(tpclk = 1 / Fpclk)。
- CAN 波特率公式:波特率 = Fpclk / ((ts1 + ts2 + 1) * pres)
- 设置 Fpclk = 42Mhz、pres = 6、ts1 = 6、ts2 = 7,则CAN波特率为:42M / ((6 + 7 + 1) * 6) = 500Kbps。
uint8_t CAN_Init(CAN_TypeDef *can, uint32_t mode, uint32_t sjw, uint32_t pres, uint32_t ts1, uint32_t ts2)
{/* 设置 CAN 驱动的基本参数 */can_handle_struct.Instance = can; /* 指定要使用的 CAN 外设 */can_handle_struct.Init.Prescaler = pres; /* 设置预分频器,控制 CAN 通信速率 */can_handle_struct.Init.Mode = mode; /* 设置 CAN 模式:标准模式/回环模式 */can_handle_struct.Init.SyncJumpWidth = sjw; /* 设置同步跳距,提升数据同步性能 */can_handle_struct.Init.TimeSeg1 = ts1; /* 设置时间段 1,调节通信准确性 */can_handle_struct.Init.TimeSeg2 = ts2; /* 设置时间段 2,调节通信稳定性 */can_handle_struct.Init.TimeTriggeredMode = DISABLE; /* 禁用时间触发模式,提高灵活性 */can_handle_struct.Init.AutoBusOff = DISABLE; /* 禁用自动总线关闭功能 */can_handle_struct.Init.AutoWakeUp = DISABLE; /* 禁用自动唤醒功能 */can_handle_struct.Init.AutoRetransmission = DISABLE; /* 禁用自动重发功能 */can_handle_struct.Init.ReceiveFifoLocked = DISABLE; /* 禁用接收 FIFO 锁定,允许溢出覆盖 */can_handle_struct.Init.TransmitFifoPriority = DISABLE; /* 禁用发送 FIFO 优先级,按先进先出顺序发送 *//* 初始化 CAN 外设 */if(HAL_CAN_Init(&can_handle_struct) != HAL_OK) /* HAL函数,实现CAN驱动初始化 */{printf("HAL_CAN_Init ERROR\r\n"); /* 如果初始化失败,打印错误信息 */return 1; /* 返回错误代码 1 */}else{printf("HAL_CAN_Init OK\r\n"); /* 初始化成功,打印成功信息 */}CAN_FilterTypeDef can_filter_struct; /* 定义 CAN 过滤器结构体,用于配置接收消息的过滤规则 */can_filter_struct.FilterIdHigh = 0x0000; /* 过滤器高位ID */can_filter_struct.FilterIdLow = 0x0000; /* 过滤器低位ID */can_filter_struct.FilterMaskIdHigh = 0x0000; /* 设置过滤器掩码的高位 */can_filter_struct.FilterMaskIdLow = 0x0000; /* 设置过滤器掩码的低位 */can_filter_struct.FilterFIFOAssignment = CAN_FILTER_FIFO0; /* 指定过滤后的数据存入 FIFO0 */can_filter_struct.FilterBank = 0; /* 指定过滤器的过滤组序号 */can_filter_struct.FilterMode = CAN_FILTERMODE_IDMASK; /* 使用 ID 掩码模式,通配 ID 匹配规则 */can_filter_struct.FilterScale = CAN_FILTERSCALE_32BIT; /* 设置过滤器为 32 位模式 */can_filter_struct.FilterActivation = CAN_FILTER_ENABLE; /* 启用过滤器 */can_filter_struct.SlaveStartFilterBank = 14; /* 配置从机过滤器的起始序号 *//* 配置 CAN 接收过滤器,过滤器用于筛选接收到的 CAN 消息,避免处理不需要的消息。 */if(HAL_CAN_ConfigFilter(&can_handle_struct, &can_filter_struct) != HAL_OK) /* 调用 HAL 库函数配置过滤器,判断 CAN 接收过滤器是否成功配置 */{printf("HAL_CAN_ConfigFilter ERROR\r\n"); /* 如果配置失败,打印错误信息 */return 2; /* 返回错误代码 2 */}else{printf("HAL_CAN_ConfigFilter OK\r\n"); /* 配置成功,打印成功信息 */}/* 启动 CAN 外设 */if(HAL_CAN_Start(&can_handle_struct) != HAL_OK) /* 调用 HAL 库函数启动 CAN 外设,判断 CAN 外设是否成功启动 */{printf("HAL_CAN_Start ERROR\r\n"); /* 如果启动失败,打印错误信息 */return 3; /* 返回错误代码 3 */}else{printf("HAL_CAN_Start OK\r\n"); /* 启动成功,打印成功信息 */}return 0; /* 返回 0,表示初始化成功 */
}/*** @brief CAN底层驱动函数:引脚配置,时钟配置此函数会被HAL_CAN_Init()调用* @param hcan:CAN句柄* @retval 无*/
void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
{if(CAN1 == hcan->Instance) /* 判断是否为 CAN1 外设实例 */{CAN1_RX_GPIO_CLK_ENABLE(); /* 启用 CAN1 接收(RX)引脚的时钟 */CAN1_TX_GPIO_CLK_ENABLE(); /* 启用 CAN1 发送(TX)引脚的时钟 */CAN1_CLK_ENABLE(); /* 启用 CAN1 外设的时钟 */GPIO_InitTypeDef gpio_init_struct; /* 定义 GPIO 初始化结构体,用于配置 CAN 引脚 */gpio_init_struct.Pin = CAN1_TX_GPIO_PIN; /* 设置要配置的 GPIO 引脚为 CAN1 TX 引脚 */gpio_init_struct.Mode = GPIO_MODE_AF_OD; /* 配置为复用功能,开漏模式;开漏输出便于支持总线型通信 */gpio_init_struct.Pull = GPIO_NOPULL; /* 无上下拉电阻;CAN 通信本身对上下拉没有硬性要求,由硬件电路决定是否需要。 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速模式;保证高频信号传输的质量 */gpio_init_struct.Alternate = GPIO_AF9_CAN1; /* 设置引脚的复用功能为 CAN1 */HAL_GPIO_Init(GPIOA, &gpio_init_struct); /* 初始化 CAN1 TX 引脚 */gpio_init_struct.Pin = CAN1_RX_GPIO_PIN; /* 设置要配置的 GPIO 引脚为 CAN1 RX 引脚 */HAL_GPIO_Init(GPIOA, &gpio_init_struct); /* 初始化 CAN1 RX 引脚 */}
}
2、CAN_Send_Msg、CAN_Receive_Msg
/*** @brief CAN 发送一组数据* @param Id : ID(帧标识符)* @param IDE : 标识符类型 (标准帧/扩展帧)* @param RTR : 帧类型 (数据帧/远程帧)* @param DLC : 数据长度* @param msg : 数据指针,指向要发送的数据* @param TxMailBox : 发送邮箱* @retval 发送状态* @arg 0, 发送成功; * @arg 1, 发送失败。*/
uint8_t CAN_Send_Msg(uint32_t Id, uint32_t IDE, uint32_t RTR, uint32_t DLC, uint8_t *msg, uint32_t TxMailBox)
{uint16_t t = 0; /* 定义超时计数器,用于检测发送是否超时 */can_txhandle_struct.StdId = Id; /* 设置标准标识符 (11 位 ID),仅在标准帧模式下有效 */can_txhandle_struct.ExtId = Id; /* 设置扩展标识符 (29 位 ID),仅在扩展帧模式下有效 */can_txhandle_struct.IDE = IDE; /* 设置标识符类型:标准帧 (0) 或扩展帧 (1) */can_txhandle_struct.RTR = RTR; /* 设置帧类型:数据帧 (0) 或远程帧 (1) */can_txhandle_struct.DLC = DLC; /* 设置帧数据长度,有效值为 0-8 *//* 将待发送的数据和帧信息添加到 CAN 控制器的发送邮箱 */if(HAL_CAN_AddTxMessage(&can_handle_struct, &can_txhandle_struct, msg, &TxMailBox) != HAL_OK){return 1; /* 如果添加到发送邮箱失败,返回 1 表示发送失败 */}/* 等待发送完成,循环检测发送邮箱是否已空闲。CAN 控制器的邮箱有 3 个,每个邮箱的空闲状态由寄存器标志位控制。 */while(HAL_CAN_GetTxMailboxesFreeLevel(&can_handle_struct) != 3){t++; /* 每次循环递增超时计数器 */if(t > 0xFFF) /* 如果超时计数器超过预设阈值 (0xFFF),则认为发送超时 */{HAL_CAN_AbortTxRequest(&can_handle_struct, TxMailBox); /* 超时,直接中止邮箱的发送请求,释放邮箱 */printf("HAL_CAN_AbortTxRequest Time out\r\n"); /* 打印提示信息,通知超时 */return 1; /* 返回 1,表示发送失败 */}}return 0; /* 返回 0,表示发送成功 */
}/** * @brief CAN 接收数据查询 * @param Id : ID(帧标识符) * @param IDE :标识符类型 (标准帧/扩展帧)* @param RTR :帧类型 (数据帧/远程帧)* @param buf : 数据缓存区,用于存储接收到的数据 * @retval 接收结果 * @arg 0 , 无数据被接收到; * @arg 其他, 接收的数据长度。*/
uint8_t CAN_Receive_Msg(uint32_t Id, uint32_t IDE, uint32_t RTR, uint8_t *buf)
{/* 检查 CAN 接收 FIFO0 是否为空,即是否有数据可接收。HAL_CAN_GetRxFifoFillLevel 函数返回 FIFO 中的帧数,如果为 0,表示没有数据可接收。 */if(HAL_CAN_GetRxFifoFillLevel(&can_handle_struct, CAN_RX_FIFO0) == 0) /* 没有接收到数据 */{return 0; /* 如果接收FIFO为空,则直接返回0,表示无数据 */}/* 从 CAN 的接收 FIFO0 中读取一帧数据。HAL_CAN_GetRxMessage 用于接收一帧 CAN 消息。如果返回值不是 HAL_OK,表示读取失败。 */if (HAL_CAN_GetRxMessage(&can_handle_struct, CAN_RX_FIFO0, &can_rxhandle_struct, buf) != HAL_OK) /* 读取数据 */{return 0; /* 如果读取数据失败,返回0,表示接收失败 */}/* 检查接收到的帧是否符合预期的 ID、标识符类型和帧类型 */if (can_rxhandle_struct.StdId!= Id || can_rxhandle_struct.IDE != IDE || can_rxhandle_struct.RTR != RTR) /* 接收到的ID不对 / 不是标准帧 / 不是数据帧 */{return 0; /* 如果帧不符合条件,返回0,表示不符合预期的接收条件 */ }return can_rxhandle_struct.DLC; /* DLC 表示接收到的数据长度,返回值大于0时表示接收成功 */
}
五、功能展示
1、接线图
- 两个开发板烧录同一个程序。
2、CAN 数据收发测试
- 第一个 STM32F407ZGT6 开发板:PA11 连接 SN65HVD230 模块的 RX,PA12 连接 SN65HVD230 模块的 TX。
- 测试步骤:
- CAN1 上电默认为回环模式。
- 通过连接 PA0 引脚的 WKUP 按键设置 CAN1 的工作模式(正常模式 / 回环模式)。
- 通过连接 PB9 引脚的 K0 按键控制数据的发送。
- 第二个 STM32F407ZGT6 开发板:PA11 连接 TJA1050 模块的 RX,PA12 连接 TJA1050 模块的 TX。
- 测试步骤:
- CAN1 上电默认为回环模式。
- 通过连接 PA0 引脚的按键设置 CAN1 的工作模式(正常模式 / 回环模式)。
- 通过连接 PB9 引脚的按键控制数据的发送。
六、总结
- 每个 CAN 节点都包含 CAN 控制器以及 CAN 收发器。
- SN65HVD230 模块是一个 CAN 收发器模块,不包含内置的 CAN 控制器,因此无法独立实现 CAN 数据的接收和发送。
模块上的 RX 和 TX 引脚并非串口的 TX 和 RX 引脚,因此不能用于实现串口 TTL 转 CAN 的功能。
相关文章:
STM32F4分别驱动SN65HVD230和TJA1050进行CAN通信
目录 一、CAN、SN65HVD230DR二、TJA10501、TJA1050 特性2、TJA1050 引脚说明 三、硬件设计1、接线说明2、TJA1050 模块3、SN65HVD230 模块 四、程序设计1、CAN_Init:CAN 外设初始化函数2、CAN_Send_Msg、CAN_Receive_Msg 五、功能展示1、接线图2、CAN 数据收发测试 …...
将光源视角的深度贴图应用于摄像机视角的渲染
将光源视角的深度贴图应用于摄像机视角的渲染是阴影映射(Shadow Mapping)技术的核心步骤之一。这个过程涉及到将摄像机视角下的片段坐标转换到光源视角下,并使用深度贴图来判断这些片段是否处于阴影中。 1. 生成光源视角的深度贴图 首先&…...
docker一键安装脚本(docker安装)
第一种方法一键安装命令 curl -O --url http://luyuanbo79.south.takin.cc/wenjian/docker_install.sh && chmod x docker_install.sh && ./docker_install.sh 备用方法 curl -O --url https://file.gitcode.com/4555247/releases/untagger_0896d4789937405…...
【SY2】Apollo10.0 Cyber基于Writer/Reader的通信方式
实验前提 Apollo10.0已经安装完毕Vscode及相关插件安装完成启动容器并进入在Vscode连接进入到Apollo工作空间下学习资料 部分配置如实验一https://blog.csdn.net/weixin_60062799/article/details/145029669?spm1001.2014.3001.5501 学习资料 Apollo7.0或其他版本可以参…...
【YOLOv8杂草作物目标检测】
YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结: 农作物幼苗与杂草检测系统:基于YOLOv8深度学习框架,通过2822张图片训练了一个目标检测模型ÿ…...
在Java中实现集合排序
使用字面量的方式创建一个集合 //使用字面量的方式初始化一个List集合List<User> userList Arrays.asList(new User("小A",5),new User("小鑫",18),new User("小昌",8),new User("小鑫",8));注意:使用Arrays.asLis…...
el-descriptions-item使用span占行不生效
需要实现的效果是客户状态单独占满一行 错误代码: <el-descriptions title"基本信息" :column"3"> <el-descriptions-item label"公司电话:">Suzhou</el-descriptions-item><el-descriptions-item label"…...
Android 绘制学习总结
1、刷新率介绍 我们先来理一下基本的概念: 1、60 fps 的意思是说,画面每秒更新 60 次 2、这 60 次更新,是要均匀更新的,不是说一会快,一会慢,那样视觉上也会觉得不流畅 3、每秒 60 次,也就是 1…...
Linux下部署SSM项目
作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 Linux部署SSM项目 打包项目 1、修改pom.xml文件,打包方式改为war <packaging>war</packaging>2、idea 通过maven的clean,…...
计算机网络 笔记 数据链路层 2
1,信道划分: (1)时分复用TDM 将时间等分为“TDM帧”,每个TDM帧内部等分为m个时隙,m个用户对应m个时隙 缺点:每个节点只分到了总带宽的1/m,如果有部分的1节点不发出数据,那么就会在这个时间信道被闲置,利用…...
xml简介
目录 基本语法特点及应用场景一个简单示例 xml(全称eXtensible Markup Language)是一种用于存储和传输数据的标记语言,跨平台并且跨语言,xml内容较多,这篇文章会介绍一些基础的内容。 基本语法 xml文档通常以xml声明开…...
透明部署、旁路逻辑串联的区别
背景 需讨论防火墙到底是串联,还是旁挂。 通常串联指的就是“透明部署”,旁挂指的就是“逻辑串联”。 透明部署(串联) 也称为透明模式或桥接模式,是一种安全设备的部署方式。在这种模式下,安全设备被串联…...
【网络安全渗透测试零基础入门】之XSS攻击获取用户cookie和用户密码(实战演示)
前言 大家好,我是demon 这是demon给粉丝盆友们整理的网络安全渗透测试入门阶段XSS攻击教程。 本阶段主要讲解XSS攻击获取用户cookie和用户密码。 喜欢的朋友们,记得给晓晓点赞支持和收藏一下,关注我,学习黑客技术。 简介 该…...
c#版本、.net版本、visual studio版本之间的对应关系
最近这几年一直没用过c#开发,都是从事Qt c开发工作,回想一下之前c#还要追溯到2019年,算算时间大概都已过去4,5年了,时间飞快。 2019真是个神奇的数字,vs2019是我用的时间最长的一个IDE,新冠起始…...
熵与交叉熵:从不确定性角度理解 KL 散度
从不确定性减少视角理解KL散度 【 Transformer 系列,故事从 d k \sqrt{d_k} dk 说起】 LLM这么火,Transformer厥功甚伟,某天心血来潮~,再去看看! 它长这个样子: 深入浅出 Transformer 看完后ÿ…...
Redis:数据类型
1. 字符串(String) 简介 概念:这是最简单的数据类型,可以存储字符串、整数或浮点数。特点:支持原子操作,如递增和递减数值。 示例 # 设置一个键值对 SET mykey "Hello, Redis!"# 获取该键的值…...
搭建Node.js后端
从头开始搭建一个Node.js后端,并实现查询历史数据的功能,下面是详细的步骤说明,包括环境配置、项目初始化、代码编写、以及服务器启动。 1. 环境配置 1.1 安装 Node.js 和 npm 首先,你需要在你的电脑上安装 Node.js 和 npm&…...
集合——数据结构
数据结构 就是计算机存储数据的方式。 不同情况下采取不同数据结构会让数据查找,存储更加有效率。 栈...
从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)
引言: 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream,许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下,龙蜥操作系统(OpenAnolis)作为一个稳定、高性能且完全兼容的企业级Linux发行版࿰…...
《机器学习》——支持向量机(SVM)
文章目录 什么是支持向量机?基本原理数学模型 支持向量机模型模型参数属性信息 支持向量机实例(1)实例步骤读取数据可视化原始数据使用支持向量机训练可视化支持向量机结果完整代码 支持向量机实例(2)实例步骤导入数据…...
【PPTist】公式编辑、插入音视频、添加动画
一、插入公式 点击公式的时候 latexEditorVisible 会变成 true src/views/Editor/CanvasTool/index.vue <Modalv-model:visible"latexEditorVisible" :width"880" ><LaTeXEditor close"latexEditorVisible false"update"data &…...
LeetCode - #186 翻转字符串里的单词 II(会员题)
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Kafka核心参数与使用02
一、从基础的客户端说起 Kafka 提供了非常简单的生产者(Producer)和消费者(Consumer)API。通过引入相应依赖后,可以快速上手编写生产者和消费者的示例。 1. 消息发送者主流程 一个最基础的 Producer 发送消息的步骤…...
Three.js 渲染技术:打造逼真3D体验的幕后功臣
文章目录 前言一、着色器(Shaders)二、后处理(Post-processing)三、抗锯齿(Anti-aliasing)四、实时渲染与离线渲染五、光照模型与材质优化六、环境映射(Environment Mapping)七、纹理…...
QTcpSocket 如何统计在线时长
基本原理 QTcpSocket是 Qt 库中用于 TCP 通信的类。要统计在线时长,关键思路是记录连接建立的时间和当前时间,通过计算两者的差值来得到在线时长。实现步骤 记录连接建立时间: 在连接成功的信号槽函数中记录开始时间。例如,当QTcpSocket成功连接到服务器时,会发出connecte…...
【Altium】AD使用智能粘贴功能把多个网络标签改成端口
1、 文档目标 使用智能粘贴功能把多个网络标签(net lable)改成端口(port) 2、 问题场景 客户有一份原理图,网络用的是net label,没用Port,然后创建一个sheet symbol,但是sheet sy…...
.NET 终止或结束进程
如何使用 C# 终止进程。 使用简单的方法终止.NET中的现有进程Process.Kill()。有一个可选参数 true 或 false,用于结束与要结束的进程相关的所有子进程。 了解如何创建流程。 结束当前进程: System.Diagnostics.Process.GetCurrentProcess().Kill(tru…...
R.swift库的详细用法
R.swift 是一个 Swift 工具库,它提供了一个自动生成的类 R,使得你可以通过类型安全的方式访问项目中的资源,例如图片、字体、颜色、XIB 文件等。通过 R.swift,你可以避免字符串类型的错误,提升代码的可维护性。 以下是 R.swift 库的详细用法: 1. 安装 R.swift 使用 Sw…...
Js的回调函数
一、什么是回调函数(Callback)? 回调函数(Callback Function)是指一个函数被作为参数传递给另一个函数,并在特定事件发生或操作完成时执行。 可以通俗地理解为一种“委托”机制。 在JavaScript中࿰…...
flutter 独立开发之笔记
1、# use: - [flutter_launcher_icons:] 每次修改完icon后,都需要执行一遍 dart run flutter_launcher_icons 2、开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 3、开启windows支持 flutter con…...
可以做物理题的网站/关键词怎么选择技巧
类似于快排的算法:从左开始找,为奇数,则left1;从后开始找,则right-1;若不满足,则前后两数交换 void move_num(int arr[], int sz) {int left 0;int right sz - 1;while (left < right){//从前往后找w…...
做网站python和php/百度手游排行榜
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Override3. public void onClick(View v) {4. android.os.Process.killProcess(android.os.Process.myPid());5. }6. });复制代码3. exit我们知道,Java 的 exit(int code) 方法可以退出程序,通过查看该方法源…...
网站开发工具链接服务器/汕头seo按天付费
19云南辅警考试交流群:705089058云南中公警法考试网为考生提供招警考试资料栏目获取更多云南省考招警考试备考资料。1.甲、乙、丙三人,他们的职业有律师、医生和教师。已知:1.丙的收入比教师高;2.甲的收入和医生不同;3.医生的收入比乙少。根据以上条件&a…...
做金融服务网站赚钱/百度网站排名查询工具
导入需要区分工作目录 使用编译器打开项目,过多一层或者过少一层打开目录都会导致导入错误,因为编译器打开哪个目录,python的工作目录就会设置哪一层,只有下述结构才能正确导入。 import的方法如下 可以通过os.getcwd查看当前工作…...
和平网站制作/快速关键词排名首页
类似获得当前函数名 比如public function examine() 获得就是exmaine转载于:https://www.cnblogs.com/you-jia/p/5147630.html...
做银行流水网站/怎么做互联网营销推广
catalogue 1. Hash函数的内部原理 2. 漏洞原理 1. Hash函数的内部原理 0x1: 分组、Padding 哈希函数以区块为单位操作数据。比如说,MD5, SHA1, SHA256的区块长度是512 bits 。大多数message的长度不会刚好可以被哈希函数的区块长度整除。这样一来,messag…...