(六)CAN总线通讯
文章目录
- CAN总线回环测试
- 第一种基于板载CAN测试
- 第一步确认板载是否支持
- 第二步关闭 CAN 接口将 CAN 接口置于非活动状态
- 第三步 配置 CAN 接口
- 第一步 设置 CAN 接口比特率
- 第二步 设置 CAN 启用回环模式
- 第三步 启用 CAN 接口
- 第四步 测试CAN总线回环
- 捕获 CAN 消息
- 发送 CAN 消息
- 第二种基于Linux库的原生开发
- 1. 确认硬件支持
- 2. 配置 CAN 接口
- 3. 使用 SocketCAN API 编写应用程序
- 创建 CAN 套接字
- 绑定 CAN 接口
- 发送和接收 CAN 消息
- 示例代码
- 4. 应用程序测试
CAN总线回环测试
第一种基于板载CAN测试
第一步确认板载是否支持
确保你的硬件支持 CAN,并且已经正确安装了驱动程序。可以通过以下命令检查是否检测到了 CAN 设备:
ip link show type can
可以看到板载自带了can0和can1.
can0 和 can1:是接口的名称,分别表示系统中的第一个和第二个 CAN 接口。
<NOARP,ECHO>:
NOARP:表示该接口不使用 ARP(地址解析协议)。CAN 总线不需要 ARP 因为它不是基于 IP 的网络。
ECHO:可能启用了回环模式,发送的消息会被自己的 CAN 控制器重新接收。这里不确定是否启用了,可以用指令ip -details link show 查看到:
或者单看can0,can1的状态,以can0为例子:
ip -details link show can0
mtu 16:最大传输单元(Maximum Transmission Unit),对于 CAN 接口来说MTU 通常是 16 字节,这是因为 CAN 消息的最大有效载荷是 8 字节,加上一些额外的头部信息。
qdisc noop:队列调度算法(Queueing Discipline),这里使用的是 noop,即空操作队列调度器。这意味着没有任何包调度策略被应用,所有数据包将直接传递而不会排队。
state DOWN:当前接口状态为关闭(DOWN),意味着接口未激活,无法进行通信。要激活接口,可以使用 ip link set can0 up 或 ip link set can1 up。
mode DEFAULT:表示接口的工作模式,默认情况下是标准模式。
group default:指明这个接口属于哪个组,default 是默认组。
qlen 10:队列长度(Queue Length),表示可以排队等待处理的数据包数量,在这里是 10。
链路类型
link/can:表明这是一个 CAN 类型的接口。
第二步关闭 CAN 接口将 CAN 接口置于非活动状态
如果没有激活的情况,直接跳过此步
ip link set can0 down
第三步 配置 CAN 接口
第一步 设置 CAN 接口比特率
ip link set can0 type can bitrate 500000
ip link set:这是一个用来配置网络接口的命令。
can0:指定要配置的网络接口名称,这里是 can0。
type can:指明该接口是 CAN 类型的。
bitrate 500000:设置 CAN 总线的数据传输速率(比特率)为 500 kbps。这个值应该根据你的硬件支持和需求进行调整。
设置完可以借助指令查看:
ip -details link show can0
第二步 设置 CAN 启用回环模式
指令:
ip link set can0 type can loopback on
loopback on:启用回环模式。在这种模式下,所有从 CAN 控制器发出的消息都会被重新送回到同一个控制器,而不会真正发送到物理总线上。这对于测试非常有用,因为它允许你在不连接任何其他设备的情况下验证软件是否正常工作。
设置完同样可以借助指令查看:
ip -details link show can0
第三步 启用 CAN 接口
指令:
ip link set can0 up
启动成功后同样可以借助指令查看:
ip -details link show can0
第四步 测试CAN总线回环
捕获 CAN 消息
使用 nohup 和 candump 捕获消息并记录到文件
nohup candump can0 > log.txt &
nohup:使程序在用户退出终端后继续运行。这对于长时间运行的任务很有用。
candump:这是 Linux 下的一个工具,用于捕获并显示 CAN 消息。它会实时监听指定的 CAN 接口,并输出接收到的消息。
can0:指定要监听的 CAN 接口。
log.txt:将 candump 的输出重定向到一个名为 log.txt 的文件中,而不是打印到屏幕上。
&:将命令放入后台执行,这样可以在同一终端窗口中继续输入其他命令。
发送 CAN 消息
标准数据帧发8位数据:
cansend can0 0B000123#00.00.00.00.00.00.00.01
#后面每一位数据不加.也行,注意别发错了
cansend:这是 Linux 下的一个工具,用于向指定的 CAN 接口发送 CAN 消息。
can0:指定要使用的 CAN 接口。
0B000123#00.00.00.00.00.00.00.01:这是要发送的 CAN 消息格式。
具体来说:0B000123是 CAN ID,其中 0B 表示标准帧格式(11位ID),000123是具体的 ID 值。
#分隔符,后面跟着的是数据字段。00.00.00.00.00.00.00.01 是数据字段的内容,表示 8 字节的数据。每个字节用两位十六进制数表示。
其实都用默认,就是标准数据帧:
cansend can0 123#00.00.00.00.00.00.00.02
数据也可以发0-8任意字节:
cansend can0 234#88
第二种基于Linux库的原生开发
在 Linux 下进行 CAN 总线应用开发时,通常需要通过系统调用和特定的套接字 API 来与 CAN 接口交互。Linux 内核提供了一个叫做 SocketCAN 的子系统,它使得 CAN 通信可以像普通的网络编程一样使用标准的 BSD 套接字接口来实现。下面是进行 CAN 应用开发的基本步骤:
1. 确认硬件支持
ip link show type can
加粗样式
可以看到板载自带了can0和can1.
2. 配置 CAN 接口
先关闭can接口
ip link set can0 down
配置波特率:
ip link set can0 type can bitrate 500000
如果使用回环如下操作,不使用或者使用正常模式就跳过此步,我这里采用回环测试因此执行此步骤:
ip link set can0 type can loopback on
启动can接口
ip link set can0 up
至此所有配置完成
3. 使用 SocketCAN API 编写应用程序
创建 CAN 套接字
在 C/C++ 中,可以通过 socket() 函数创建一个 CAN 套接字。例如:
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>int s;
if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {perror("Socket creation failed");return -1;
}
绑定 CAN 接口
接下来,将套接字绑定到具体的 CAN 接口(如 can0)。这可以通过 bind() 函数完成:
struct ifreq ifr;
struct sockaddr_can addr;addr.can_family = AF_CAN;
strcpy(ifr.ifr_name, "can0");if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {perror("Interface index get failed");close(s);return -1;
}addr.can_ifindex = ifr.ifr_ifindex;if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {perror("Bind to CAN interface failed");close(s);return -1;
}
发送和接收 CAN 消息
struct can_frame frame;// 构造要发送的 CAN 帧
frame.can_id = 0x123; // CAN ID
frame.can_dlc = 8; // 数据长度码(DLC),表示数据域的字节数
memset(frame.data, 0x01, frame.can_dlc); // 设置数据域内容// 发送 CAN 帧
if (write(s, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame)) {perror("Write CAN frame failed");close(s);return -1;
}// 接收 CAN 帧
if (read(s, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame)) {perror("Read CAN frame failed");close(s);return -1;
}printf("Received CAN ID=%x, DLC=%d\n", frame.can_id, frame.can_dlc);
for (int i = 0; i < frame.can_dlc; ++i)printf("Data[%d]: %02x\n", i, frame.data[i]);
示例代码
下面是一段完整的示例代码,展示了如何创建 CAN 套接字、绑定接口、发送和接收消息:
这里我开启了线程,父线程用来写,子线程用来读;代码被屏蔽掉的那部分是,禁止回环模式的,为了防止配置的时候关闭回环失败,因此软件上再关闭一次。
#include "can_config.h"#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <libgen.h>
#include <getopt.h>
#include <limits.h>#include <sys/types.h>
#include <sys/socket.h>
#include <sys/uio.h>
#include <sys/ioctl.h>
#include <net/if.h>#include <linux/can.h>
#include <linux/can/raw.h>int main()
{int s; // 就是fdint n_read = 0; // 读取到的数据个数//创建 CAN 套接字if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {perror("Socket creation failed");return -1;}printf("socket ok ========================\n");/*// 禁用回环模式(如果需要)int loopback = 0; // 0 表示关闭回环模式if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback)) < 0) {perror("Failed to disable loopback mode");close(s);return -1;}// 禁用监听自己的消息(可选)int recv_own_msgs = 0; // 0 表示关闭接收自己的消息if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, &recv_own_msgs, sizeof(recv_own_msgs)) < 0) {perror("Failed to disable receiving own messages");close(s);return -1;}*/// 绑定 CAN 接口struct ifreq ifr;struct sockaddr_can addr;addr.can_family = AF_CAN;strcpy(ifr.ifr_name, "can0");if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) {perror("Interface index get failed");close(s);return -1;}addr.can_ifindex = ifr.ifr_ifindex;if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {perror("Bind to CAN interface failed");close(s);return -1;}printf("bind ok ========================\n");// 构造要发送的 CAN 帧struct can_frame wirte_frame;struct can_frame recive_frame;wirte_frame.can_id = 0x123; // CAN IDwirte_frame.can_dlc = 8; // 数据长度码(DLC),表示数据域的字节数memset(wirte_frame.data, 0x01, wirte_frame.can_dlc); // 设置数据域内容int data = 0x01;//开启线程 一个接收一个发送;__pid_t pid;pid = fork();//返回的pid号 父进程是正数id号码,子进程是0// 父进程 write 子进程接收if(pid>0){printf("in farther ok ========================\n");while(1){// 发送 CAN 帧 间隔3秒写一次if (write(s, &wirte_frame, sizeof(struct can_frame)) != sizeof(struct can_frame)) {perror("Write CAN frame failed");close(s);return -1;}sleep(3);memset(wirte_frame.data,++data, wirte_frame.can_dlc); // 设置数据域内容} }else if(pid==0){printf("in son ok ========================\n");while(1){// 接收 CAN 帧if ((n_read = read(s, &recive_frame, sizeof(struct can_frame)) )!= sizeof(struct can_frame)) {perror("Read CAN frame failed");close(s);return -1;}if(n_read>0){printf("Received CAN ID=%x, DLC=%d\n", recive_frame.can_id, recive_frame.can_dlc);for (int i = 0; i < recive_frame.can_dlc; ++i)printf("Data[%d]: %02x\n", i, recive_frame.data[i]);}}}else{perror("fork error\n");}close(s);return 0 ;
}
4. 应用程序测试
先用交叉编译工具编译:
arm-linux-gnueabi-gcc mycan.c -o mycan
远程发送到板子:
scp ./mycan root@192.168.1.101:/root/zhua
执行:
适当改一改代码:
再测试:
这里有个小问题就是write一直写,FIFO文件队列会满,然后就是溢出报错,因此要学习错误处理等操作。
所以最后关于帧格式,位同步,仲裁,错误处理等可以深入了解。推荐在学习stm32的时候学习寄存器配置开发,可以深入的了解到。
相关文章:
(六)CAN总线通讯
文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…...
python.exe无法找到程序入口 无法定位程序输入点(Anaconda Prompt报错)
参考 总结: (1)pythoncom36.dll是pywin32的一个文件,位于路径Anaconda3\envs\pytorch(你的虚拟环境)\Lib\site-packages\pywin32_system32中; (2)但在Anaconda3\envs\pytorch\Library\bin中也…...
C++网络程序设计
在C网络编程中,使用Berkeley Sockets API是一种常见的方法来实现跨平台的TCP通信。Berkeley Sockets API最初是在UNIX系统上开发的,但它已经被广泛移植到其他操作系统,包括Windows。 示例代码 client.cpp #include <iostream> #incl…...
【快速实践】深度学习 -- 数据曲线平滑化
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! 在观察数据结果时,我们通常希望获得整体趋…...
【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
Kubernetes Gateway API-5-后端协议和网关基础设置标签
1 后端协议 自 v1.2.0 开始支持 并非所有网关API实现都支持自动协议选择。在某些情况下,协议在没有明确选择加入的情况下被禁用。 当 Route 的后端引用Kubernetes Service 时,应用程序开发人员可以使用 ServicePort appProtocol 字段指定协议。 例如…...
鸿蒙 ArkUI实现地图找房效果
常用的地图找房功能,是在地图上添加区域、商圈、房源等一些自定义 marker,然后配上自己应用的一些筛选逻辑构成,在这里使用鸿蒙 ArkUI 简单实现下怎么添加区域/商圈、房源等 Marker. 1、开启地图服务 在华为开发者官网,注册应用&…...
前后端分离架构设计与实现:构建现代Web应用的基石
前后端分离架构设计与实现:构建现代Web应用的基石 引言 随着互联网技术的发展,Web应用变得越来越复杂和多样化。传统的单体式架构难以满足快速迭代、团队协作以及性能优化的需求。前后端分离架构应运而生,它不仅提高了开发效率,…...
【51单片机】02LED流水灯实验
点亮你的LED 一、点亮第一个LED1.GPIO介绍2.P1、P2、P3端口 二、LED实验2.尝试点亮LED3.LED流水灯4.利用库函数实现流水灯的移动 一、点亮第一个LED 1.GPIO介绍 这块内容这里可以做简单的了解,与数电知识强相关。后续可以再回过头来学习 GPIO (general purpose in…...
【简博士统计学习方法】第1章:4. 模型的评估与选择
4. 模型的评估与选择 4.1 训练误差与测试误差 假如存在样本容量为 N N N的训练集,将训练集送入学习系统可以训练学习得到一个模型,我们将这么模型用决策函数的形式表达,也就是 y f ^ ( x ) y\hat{f}(x) yf^(x),关于模型的拟合…...
GitLab创建用户,设置访问SSH Key
继上一篇 Linux Red Hat 7.9 Server安装GitLab-CSDN博客 安装好gitlab,启用管理员root账号后,开始创建用户账户 1、创建用户账户 进入管理后台页面 点击 New User 输入用户名、邮箱等必填信息和登录密码 密码最小的8位,不然会不通过 拉到…...
flutter 专题二十四 Flutter性能优化在携程酒店的实践
Flutter性能优化在携程酒店的实践 一 、前言 携程酒店业务使用Flutter技术开发的时间快接近两年,这期间有列表页、详情页、相册页等页面使用了Flutter技术栈进行了跨平台整合,大大提高了研发效率。在开发过程中,也遇到了一些性能相关问题和…...
RAFT:随机退火森林
RAFT:随机退火森林 RAFT(Randomized Annealed Forests)是一种机器学习算法,主要用于分类和回归任务。以下是对它的介绍及原理举例说明: 一、RAFT简介 RAFT是一种基于随机森林的集成学习方法,它结合了随机森林的优点和退火算法的思想。随机森林通过构建多个决策树并综…...
上下游服务间解耦的技术与管理
一、解耦为何至关重要 在当今软件研发的复杂生态中,耦合问题如影随形,困扰着众多开发者与企业。当多个模块、系统或团队紧密交织,相互依赖程度不断攀升,仿佛一张错综复杂的网,牵一发而动全身。就拿电商系统来说&#…...
[桌面运维]windows自动设置浅深色主题
设置自动浅色/深色主题 我看很多up主的教程过于繁琐,需要添加四个功能,并且有些还不能生效! 大多数都是教程: 自动任务栏浅色 add HKCUSOFTWAREMicrosoftWindowsCurrentVersionThemesPersonalize/v SystemUsesLightTheme /t …...
【Spring】Spring DI(依赖注入)详解——注入参数的细节处理-内部Bean的注入
引言 在现代Java开发中,Spring框架已经成为了构建企业级应用的标准工具之一。Spring的核心特性之一就是依赖注入(Dependency Injection,DI),它通过将对象的依赖关系从代码中解耦出来,提升了代码的可维护性…...
Docker: 教程07 - ( 如何对 Docker 进行降级和升级)
如果我们使用 docker 来管理容器,那么保持 docker 引擎的更新将会是十分重要的,这一篇文章我们将会讨论如何对Docker 进行降级和升级。 准备工作 - docker 环境 我们需要拥有一个安装好 docker 的运行环境。 如果你需要了解如何安装 docker 可以通过如…...
CV-LLM经典论文解读|VTimeLLM: Empower LLM to Grasp Video MomentsVTimeLLM:赋能大语言模型理解视频片段
论文标题 VTimeLLM: Empower LLM to Grasp Video Moments VTimeLLM:赋能大语言模型理解视频片段 论文链接: VTimeLLM: Empower LLM to Grasp Video Moments论文下载 论文作者 Bin Huang, Xin Wang, Hong Chen, Zihan Song, Wenwu Zhu (Tsinghua Un…...
新手学习yolov8目标检测小记2--对比实验中经典模型库MMDetection使用方法(使用自己的数据集训练,并转换为yolo格式评价指标)
一、按照步骤环境配置 pip install timm1.0.7 thop efficientnet_pytorch0.7.1 einops grad-cam1.4.8 dill0.3.6 albumentations1.4.11 pytorch_wavelets1.3.0 tidecv PyWavelets -i https://pypi.tuna.tsinghua.edu.cn/simple pip install -U openmim -i https://pypi.tuna.t…...
Kubernetes开发环境minikube | 开发部署apache tomcat web单节点应用
minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署J2EE tomcat web应用 minikube start --force minikube status 如上所示,在Linux中启动minikube运行环境 service docker start docker version service docker …...
浙江安吉成新的分布式光伏发电项目应用
摘 要:分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上,利用太阳能进行发电的一种可再生能源利用方式,与传统的大型集中式光伏电站相比,分布式光伏发电具有更灵活的布局、更低的建设成本和更高…...
Git - 记录一次由于少输入了一个命令导致的更改丢失
Git - 记录一次由于少输入了一个参数导致的更改丢失 前言 某晚我激情开发了几个小时,中途没有进行commit存档。准备睡觉时,我想创建一个新的分支并将今晚所有更改提交到新分支上(似乎应该开发时候就创建?)。 然后因…...
【Nginx】设置https和http同时使用同一个端口访问
以下是一个同时使用 HTTP 和 HTTPS 并通过 8070 端口的配置示例: server {listen 8070;server_name your_domain.com;location / {root /var/www/html;index index.html;} }server {listen 8070 ssl;server_name your_domain.com;# SSL 证书和私钥的路径ssl_certif…...
Vue 组件开发:构建高效可复用的 UI 构建块
在现代前端开发中,Vue.js 凭借其简洁的 API、渐进式框架设计和强大的生态系统,已经成为众多开发者的首选。Vue 组件化开发是其核心特性之一,它允许我们将复杂的 UI 拆分成多个独立、可复用的组件,从而提高代码的可维护性和可扩展性…...
【Uniapp-Vue3】v-if条件渲染及v-show的选择对比
如果我们想让元素根据响应式变量的值进行显示或隐藏可以使用v-if或v-show 一、v-show 另一种控制显示的方法就是使用v-show,使用方法和v-if一样,为true显示,为false则不显示。 二、v-if v-if除了可以像v-show一样单独使用外,还…...
浏览器报错:您的连接不是私密连接,Kubernetes Dashboard无法打开
问题描述 部署完成Kubernetes Dashboard后,打开HTTPS的web页面,Chrome和Edge浏览器都无法正常加载页面,会提示您的连接不是私密连接的报错。 原因: 浏览器不信任这些自签名的ssl证书,为了…...
asp.net core 属性路由和约定路由
在 ASP.NET Core 中,Web API 中的路由(Route)用于确定客户端请求的 URL 与服务器端处理逻辑之间的映射关系。路由机制在 Web API 的开发中非常重要,它帮助定义和管理不同请求路径如何触发特定的控制器和操作方法。 1. 路由概述 …...
机器学习之模型评估——混淆矩阵,交叉验证与数据标准化
目录 混淆矩阵 交叉验证 数据标准化 0-1标准化 z 标准化 混淆矩阵 混淆矩阵(Confusion Matrix)是一种用于评估分类模型性能的工具。 它是一个二维表格,其中行表示实际的类别,列表示模型预测的类别。 假设我们有一个二分类问题&…...
Java实现UDP与TCP应用程序
三、Java实现UDP应用程序 3.1 InetAddress类 java.net.InteAddress类是用于描述IP地址和域名的一个Java类; 常用方法如下: public static InetAddress getByName(String host):根据主机名获取InetAddress对象public String getHostName()…...
[python3]Excel解析库-calamine,10倍openpyxl性能
calamine 是一个用于读取多种电子表格格式(如 Excel、LibreOffice Calc 等)的 Python 库。它支持 .xls, .xlsx, .ods 和 .csv 文件格式,提供了简单易用的 API 来加载和处理电子表格数据。calamine 的一大特点是它的轻量级和高效性,…...
Clisoft SOS设置Server和Project
Clisoft SOS设置Server和Project 一、关于SOS Servers、Clients、Projects和Work Areas 以下三个图是官方文档中介绍的三种情况 图1:带有两个客户端的SOS服务器 图2:使用本地缓存服务器 图3:远程设计团队的缓存服务器 因为SOS软件需要…...
基于FPGA的出租车里程时间计费器
基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 (1);里程计费功能:3公里以内起步价8元,超过3公里后每公里2元,其中…...
AnaConda下载PyTorch慢的解决办法
使用Conda下载比较慢,改为pip下载 复制下载链接到迅雷下载 激活虚拟环境,安装whl,即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl...
Hello 2025(A-C)
补题链接:Dashboard - Hello 2025 - Codeforces A. MEX Table 思路 除了含0的列和行其他的都是0,输出max(n,m)1即可 代码 #include<bits/stdc.h> using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); co…...
Burpsuite20241102macM1版安装
1、安装jdk11 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew update brew install openjdk11 echo export PATH"/opt/homebrew/opt/openjdk11/bin:$PATH" >> ~/.zshrc source ~/.zshrc j…...
jenkins入门10--自动化构建
build periodically:设定类似cron周期性时间触发构建 * * * * * (五颗星,中间用空格隔开) 第一颗表示分钟,取值0~59 第二颗表示小时,取值0~23 第三颗表示一个月的第几天,取值1~31 第四颗表示第几月…...
Java基础概念
自动装箱 Integer i 10; //装箱 int n i; //拆箱 普通数据类型:直接在栈内存中分配空间,存储的是具体的值。包装类:作为对象在堆内存中分配空间。包装类实际上是对普通数据类型的封装,每个包装类都包含了对应的数据类…...
57.在 Vue 3 中使用 OpenLayers 点击选择 Feature 设置特定颜色
在 Web 开发中,地图应用是非常常见的需求,而 OpenLayers 是一个非常强大的地图库,它提供了丰富的地图操作功能。今天,我们将一起学习如何在 Vue 3 中结合 OpenLayers 使用点击事件来选择地图上的 Feature,并设置特定的…...
HTML——61. 单行文本框和密码输入框(主讲input元素的type属性)
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单行文本框和密码输入框</title></head><body><!--input元素的type属性:(必须要有)--> <!--单行文本框:1.type"text"2.可…...
h264之多视点mvc编码及解码过程(JMVC平台举例)
h264标准参考平台JMVC是针对MVC标准的,JMVC支持多视点编码、合流、多视点解码操作。可以利用JMVC生成h264 mvc码流和解码。 JMVC的下载地址是:jvet / JMVC GitLabH.264/AVC multi-view coding (MVC) extension JMVC reference softwarehttps://vcgit.hh…...
深度学习blog-深刻理解线性变换和矩阵
深度学习中避免不了矩阵运算,或者张量(其实是矩阵数组)运算。卷积是矩阵加、乘法,注意力也是一样。本质都一样,所谓注意力,卷积、滤波,是对不必了解数学的人说的,底层都是矩阵运算&a…...
C语言 扫雷程序设计
目录 1.main函数 2.菜单打印menu函数 3.游戏game函数 4.宏定义 5.界面初始化 6.打印界面 7.设置雷 8.统计排查坐标周围雷的个数 9.排查雷 10.总代码 test.c代码 game.h代码 game.c代码 结语: 一个简单的扫雷游戏,通过宏定义可以修改行列的…...
[笔记] Jenkins 安装与配置全攻略:Ubuntu 从零开始搭建持续集成环境
随着 DevOps 流程的普及,持续集成(CI)和持续交付(CD)已成为现代软件开发中不可或缺的一部分。Jenkins 作为一款开源的自动化服务器,广泛应用于 CI/CD 管道的构建与管理。它不仅支持多种编程语言和工具链&am…...
【51单片机零基础-chapter3:按键:独立按键|||附带常见C语句.逻辑运算符】
将unsigned char var0;看作沟通二进制和十进制的桥梁 var是8位,初始为0000 0000; 同时可以进行十进制的运算 逻辑运算 位运算 & 按位与(有0则0) | 按位或(有1则1) ~ 按位非 ^ 按位异或(相同则1,不同为0) <<按位左移 >>按位右移 位运算符解释: 0011 1100 <&…...
深入浅出:深层网络处理技术的教学指南
引言 在人工智能的浪潮中,深层网络处理技术(Deep Learning)无疑是最耀眼的明星之一。无论是图像识别、自然语言处理,还是语音识别,深层网络都展现出了强大的能力。然而,对于初学者来说,深层网络…...
深入浅出Node.js-1(node.js入门)
全新专栏带你快速掌握node.js Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题: 【锦上添花】让我们前端工程师拥有了后端开发能力(开接口,访问数据库) - 大公司BFF(5…...
Django的runserver
当年执行 python manage runserver命令时 1. 先执行 runserver 中的 handle方法 2. 执行 self.run()方法 3. 执行 self.inner_run() 3.1 inner_run 下 run方法的封装 3.1.1 接着看 handle 怎么来的 封装了一个方法 接着找返回函数 3.1.2在 basehttp 下 3.1.3 get_wsgi_appl…...
MySQL 存储引擎
InnoDB InnoDB是MySQL的默认存储引擎,自MySQL 5.5版本起开始使用。它提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。 主要特性: 事务支持:完全支持ACID(原子性、一致性、隔离性、持久…...
React知识盲点——组件通信、性能优化、高级功能详解(大纲)
组件通信 React 组件通信详解 在 React 中,组件通信是一个核心概念,主要指的是如何让不同的组件共享和传递数据。React 提供了多种机制来实现组件间的数据传递和状态共享。以下是几种常见的组件通信方式,包括:父子组件通信&…...
Maven 详细配置:Maven 项目 POM 文件解读
Maven 是 Java 开发领域中广泛使用的项目管理和构建工具,通过其核心配置文件——POM(Project Object Model)文件,开发者能够定义项目的基本信息、依赖关系、插件配置以及构建生命周期等关键要素。POM 文件不仅是 Maven 项目的核心…...