(六)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的时候学习寄存器配置开发,可以深入的了解到。
相关文章:
![](https://i-blog.csdnimg.cn/direct/ff60ece241ca43de86c102e414e62121.png)
(六)CAN总线通讯
文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…...
![](https://i-blog.csdnimg.cn/img_convert/090ddef66350395f68bf5d2240e57803.jpeg)
新一代智能工控系统网络安全合规解决方案
01.新一代智能工控系统概述 新一代智能工控系统是工业自动化的核心,它通过集成人工智能、工业大模型、物联网、5G等技术,实现生产过程的智能化管理和控制。这些系统具备实时监控、自动化优化、灵活调整等特点,能够提升生产效率、保证产品质量…...
![](https://i-blog.csdnimg.cn/direct/488fe627b0204475995ab0f89d9950bc.png)
Vivado中Tri_mode_ethernet_mac的时序约束、分析、调整——(一)时序约束的基本概念
1、基本概念 推荐阅读,Ally Zhou编写的《Vivado使用误区与进阶》系列文章,熟悉基本概念、tcl语句的使用。 《Vivado使用误区与进阶》电子书开放下载!! 2、Vivado中的语法例程 1)语法例程 约束的语句可以参考vivado…...
![](https://i-blog.csdnimg.cn/img_convert/5be6efba75d988ccd39dd8680841e3d9.png)
车载网络:现代汽车的数字心跳
在汽车领域,“智能汽车”一词毫不夸张。如今的汽车已不再是原始的机械工程,而是通过先进的车载网络无缝连接的精密数字生态系统。这些滚动计算机由复杂的电子控制单元(ECU)网络提供动力,ECU是负责管理从发动机性能到信息娱乐系统等一切事务的…...
![](https://i-blog.csdnimg.cn/direct/8a1f427f2c624567805645ed8a31ebfb.png)
python基础和redis
1. Map函数 2. filter函数 numbers generate_numbers() filtered_numbers filter(lambda x: x % 2 0, numbers) for _ in range(5):print(next(filtered_numbers)) # 输出: 0 2 4 6 83. filter map 和 reduce 4. picking and unpicking 5. python 没有函数的重载࿰…...
![](https://i-blog.csdnimg.cn/img_convert/49150784165ba9ef502963dcb282256c.png)
w~自动驾驶~合集16
我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题:SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接:https://ar…...
![](https://www.ngui.cc/images/no-images.jpg)
最长的指定瑕疵度的元音子串
一、题目 最长的指定瑕疵度的元音子串 定义:开头和结尾都是元音字母(aeiouAEIOU)的字符串为 元音字符串 ,其中混杂的非元音字母数量为其 瑕疵度 。比如: “a” 、 "aa"是元音字符串,其瑕疵度都为0 "aiu…...
![](https://i-blog.csdnimg.cn/direct/d6f50f44528a4805a79e4a4ee80b2403.png)
每日算法Day15【组合、组合总和III、电话号码的字母组合】
77. 组合 算法链接: 77. 组合 - 力扣(LeetCode) 类型: 回溯 难度: 中等 回溯三步法: 1、确定参数返回值 2、确定终止条件 3、单层搜索逻辑 剪枝操作: 当path容量超过k时的数据可以不用遍历,故遍历边界条件判断: …...
![](https://i-blog.csdnimg.cn/direct/c30eb28c00ac4cfabdad12a5399c34e7.png)
C语言教程——指针进阶(2)
目录 一、函数指针数组 1.1函数指针数组写法 1.2函数指针用途 二、指向函数指针数组的指针 2.1概念 三、回调函数 3.1用法 3.2qsort排序 总结 前言 我们接着上一篇的函数指针往下学习。 一、函数指针数组 1.1函数指针数组写法 我们都知道指针数组,里面可以…...
![](https://www.ngui.cc/images/no-images.jpg)
调和级数不为整数的证明
文章目录 1. 问题引入2. 证明2.1 引理12.2 引理22.3 引理3:2.4 核心证明: 3. 参考 1. 问题引入 s ( n ) 1 1 2 1 3 ⋯ 1 n , n ∈ N ∗ , n ≥ 2 s(n) 1\frac{1}{2}\frac{1}{3}\cdots\frac{1}{n}, \quad \\n \in N^*, n \ge2 s(n)12131⋯n1,…...
![](https://i-blog.csdnimg.cn/img_convert/bb182e637f36dc6ffe146dac958727bd.png)
基于微信小程序的在线学习系统springboot+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83A)
基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)
已完成功能: 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制,可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…...
![](https://i-blog.csdnimg.cn/img_convert/ff95ee4eb6e4507b6389f70a5122935e.png)
有机物谱图信息的速查技巧有哪些?
谱图信息是化学家解读分子世界的“语言”,它们在化学研究的各个领域都发挥着不可或缺的作用。它们是理解和确定分子结构的关键,对化学家来说极为重要,每一种谱学技术都提供了不同的视角来观察分子,从而揭示其独特的化学和物理特性…...
![](https://www.ngui.cc/images/no-images.jpg)
Eureka缓存机制
一、Eureka的CAP特性 Eureka是一个AP系统,它优先保证可用性(A)和分区容错性(P),而不保证强一致性(C)。这种设计使得Eureka在分布式系统中能够应对各种故障和分区情况,保…...
![](https://www.ngui.cc/images/no-images.jpg)
【LC】78. 子集
题目描述: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出࿱…...
![](https://i-blog.csdnimg.cn/direct/6884a4b3f1de459982f1398e55849020.jpg)
协同过滤算法私人诊所系统|Java|SpringBoot|VUE|
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SpringBoot、Mybatis-Plus、VUE、jquery,html 5⃣️…...
![](https://www.ngui.cc/images/no-images.jpg)
Docker部署Naocs-- 超细教程
Docker 拉取镜像 docker pull nacos/nacos-server:v2.2.0 挂载目录 如果不是root账号 前面加sudo 或者 切换root账号 su root(命令) mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p /mydata/nacos/conf/ #新建conf目录 启动容器…...
![](https://i-blog.csdnimg.cn/direct/b57302f0a2dc46a0955107d953125a78.png)
[java基础-集合篇]优先队列PriorityQueue结构与源码解析
优先队列PriorityQueue 优先级队列表示为平衡二进制堆: queue[n] 的两个子级是 queue[2*n1] 和 queue[2*(n1)]。 注:左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…...
![](https://www.ngui.cc/images/no-images.jpg)
12. C语言 数组与指针(深入理解)
本章目录: 前言1. 什么是数组?2. 数组的声明与初始化声明数组初始化数组 3. 访问数组元素遍历数组 4. 获取数组长度使用 sizeof 获取长度使用宏定义简化 5. 数组与指针数组名与指针的区别使用指针操作数组 6. 多维数组遍历多维数组 7. 数组作为函数参数8. 高级技巧与…...
![](https://i-blog.csdnimg.cn/direct/12b869b9ca8347d9a084a48c43c44feb.jpeg)
Postman接口测试基本操作
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Postman-获取验证码 需求:使用Postman访问验证码接口,并查看响应结果。 地址:http://kdtx-test.itheima.net/api/captchaIm…...
![](https://img-blog.csdnimg.cn/direct/67c64049147741939b85489caefbb597.png)
MySQL--2.1MySQL的六种日志文件
大家好,我们来说一下MySQL的6中日志文件。 1.查询日志 查询日志主要记录mysql的select查询的,改配置是默认关闭的。不推荐开启,因为会导致大量查询日志文件储存占用你的空间。 举例查询一下 select * from class; 开启查询日志的命…...
![](https://www.ngui.cc/images/no-images.jpg)
spring task使用
Spring Task 简介 Spring Task 是 Spring 框架原生自带的任务调度框架,它犹如一把瑞士军刀,为开发者提供了丰富多样的功能,助力轻松创建和管理定时任务。相较于其他一些第三方任务调度框架,Spring Task 最大的优势在于其与 Sprin…...
![](https://i-blog.csdnimg.cn/direct/0420b3c4b9e44b759b06eafb13e02603.png)
【FPGA】时序约束与分析
设计约束 设计约束所处环节: 约束输入 分析实现结果 设计优化 设计约束分类: 物理约束:I/O接口约束(例如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束 时序约束:设计FP…...
![](https://www.ngui.cc/images/no-images.jpg)
LLM的MoE由什么构成:门控网络,专家网络
LLM的MoE由什么构成:门控网络,专家网络 目录 LLM的MoE由什么构成:门控网络,专家网络专家网络门控网络MoE在联邦学习中的使用及原理专家网络 定义与特点:是一组独立的模型,每个模型都负责处理某个特定的子任务或学习输入空间的特定部分。这些专家可以是简单的线性回归模型…...
![](https://www.ngui.cc/images/no-images.jpg)
HTML-多媒体标签
除了图像,网页还可以放置视频和音频。 1.<video> <video>标签是一个块级元素,用于放置视频。如果浏览器支持加载的视频格式,就会显示一个播放器,否则显示<video>内部的子元素。 <video src"example.…...
![](https://i-blog.csdnimg.cn/direct/ff9a172faa054cfeb334b75bf7ba870c.png)
MySQL笔记大总结20250108
Day2 1.where (1)关系运算符 select * from info where id>1; select * from info where id1; select * from info where id>1; select * from info where id!1;(2)逻辑运算符 select * from info where name"吴佩奇" and age19; select * from info wh…...
![](https://i-blog.csdnimg.cn/direct/a5c5039a429d40818d5797b8bc276d2c.png)
stm32week3
stm32学习 二.外设 8.TIM输出比较 OC(output compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0、翻转操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的…...
![](https://i-blog.csdnimg.cn/direct/68b308d3e05c44c3a857a6305467a69c.png)
uniapp 的uni.getRecorderManager() 录音功能小记
官网上明确说的是全局唯一并且只是获取对象,所以会导致一个问题就是,当你多个页面要用到这个对象的时候,会发现 onStop 方法会被覆盖,导致调用结果不是自己想要的 解决办法也简单粗暴,在需要用到的界面重新覆盖onStop…...
![](https://i-blog.csdnimg.cn/direct/54ae0a0f4a3949c58de3aa9f55f7ddd5.png)
【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法
工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法,主要考察开发经验与技术水平,回答不佳会影响面试印象。提供四个回答方向,准备其中一个方向即可。 1、设计模式应用方向 以登录为例,未…...
![](https://i-blog.csdnimg.cn/direct/cf03079d09714b22bc75cec94fdaeb23.png)
RT-DETR代码详解(官方pytorch版)——参数配置(1)
前言 RT-DETR虽然是DETR系列,但是它的代码结构和之前的DETR系列代码不一样。 它是通过很多的yaml文件进行参数配置,和之前在train.py的parser argparse.ArgumentParser()去配置所有参数不同,所以刚开始不熟悉代码的时候可能不知道在哪儿修…...
![](/images/no-images.jpg)
企业网站seo参考文献/seo排名的公司
Orgrimmar 题意: 就是给你一个树,然后让你选择一些点集,每个点的度<1。问你这个点集最大是多少。 思考: 刚开始我想了个贪心,既然度<1的才能保留,那么我先把度>3的全部删掉,剩下的能…...
政府网站asp源码/网络优化是做什么的
日常开发中,我们经常用到this。例如用Jquery绑定事件时,this指向触发事件的DOM元素;编写Vue、React组件时,this指向组件本身。对于新手来说,常会用一种意会的感觉去判断this的指向。以至于当遇到复杂的函数调用时&…...
![](/images/no-images.jpg)
网站开发工具 晴天娃娃/网站建设开发
本文实例讲述了php实现基于pdo的事务处理方法。分享给大家供大家参考,具体如下:实例1:try {} catch () {} 形式$dsn mysql:dbnamecheyun_cms;host127.0.0.1;$user root;$password 111111;//采用预处理事务处理执行SQL操作//1.连接数据库tr…...
wordpress订阅支付/seo查询网站
写在前面: 注意:在前篇中所用的工具都是2015.2,从这篇开始将使用2017.4进行操作。 安装环境:win7,win10,Xilinx SDK 2017.4,Xilinx Vivado 2017.4 虚拟机:Ubuntu16.04,petalinux 2017.4 建立Petalinux工…...
![](/images/no-images.jpg)
织梦网暂时关闭网站/网络推广营销方式
在我们的项目中,常常会碰到图片与文字混排的问题。解决这类问题的方法有非常多,本文给出的方法不是唯一的。仅仅有依据实际场景才干找到更适合的方法。 本文主要通过xml布局来实现图片与文字的混排(水平排列)。1.利用TextView实现…...
![](https://img-blog.csdnimg.cn/img_convert/f60362ef03ca169caa4ebeb1f7167217.png)
富阳区建设局网站首页/淘宝指数
▼电脑端zoom操作指引▼1、电脑端用户在哪里下载zoom?2、电脑端zoom如何加入会议?3、进入zoom后发现忘记填写正确上课名称,怎么改名?4、如何看到主讲老师或其他参会者?5、听不到声音,怎么办?6、其他注意事…...