Ubuntu20.04 上启用 VCAN 用作本地调试

目录

一、启用本机的 VCAN​ 编辑

1.1  加载本机的 vcan

1.2  添加本机的 vcan0

1.3  查看添加的 vcan0

1.4  开启本机的 vcan0

1.5  关闭本机的 vcan0

1.6  删除本机的 vcan0

二、测试本机的 VCAN

2.1  CAN 发送数据 代码

2.2  CAN 接收数据 代码

2.3  CMakeLists.txt 代码

2.4  虚拟 CAN 收发测试

三、VCAN 的其它操作

3.1  启用 VCAN

3.2  关闭 VCAN

3.3  重启 VCAN

3.4  停止 VCAN

3.5  设备波特率

3.6  显示 VCAN 详情

3.7  VCAN 回环测试

3.8  发送 VCAN 数据

3.9  接收 VCAN 数据

3.10  查看 VCAN 状态

3.11  VCAN 数据过滤


当没有CAN设备时,可使用 Ubuntu 的虚拟 CAN 进行通讯测试。

一、启用本机的 VCAN

  1.1 加载本机的 vcan

# 加载虚拟 CAN:sudo modprobe vcan

  1.2 添加本机的 vcan0

# 添加 VCAN0 到操作系统:sudo ip link add dev can0 type vcan

  1.3 查看添加的 vcan0

# 查看 CAN0 :ifconfig -a

  1.4 开启本机的 vcan0

# 开启 CAN0 :sudo ip lin

  1.5 关闭本机的 vcan0

# 关闭 CAN0 :sudo ip link set dev can0 down

  1.6 删除本机的 vcan0

# 删除 CAN0 :sudo ip link del dev can0

二、测试本机的 VCAN

  2.1 CAN 发送数据 代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>int main(int argc, char* argv[]) {int skt = socket(PF_CAN, SOCK_RAW, CAN_RAW);if (0 > skt) {perror("create socket error");return -1;}// 指定 can0 设备struct ifreq ifr = { 0 };strcpy(ifr.ifr_name, "vcan0");ioctl(skt, SIOCGIFINDEX, &ifr);struct sockaddr_can addr = { 0 };addr.can_family = AF_CAN;addr.can_ifindex = ifr.ifr_ifindex;// 将 can0 与套接字进行绑定int rv = bind(skt, (struct sockaddr*)&addr, sizeof(addr));if (rv < 0) {perror("bind socket error");close(skt);return -2;}// 设置过滤规则:不接受任何报文、仅发送数据setsockopt(skt, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);// 发送数据struct can_frame frame = { 0 };frame.can_id = 0x123;frame.can_dlc = 6; {frame.data[0] = 0xA0;frame.data[1] = 0xB0;frame.data[2] = 0xC0;frame.data[3] = 0xD0;frame.data[4] = 0xE0;frame.data[5] = 0xF0;}unsigned short index = 0;while (true) {// 开始发送数据rv = write(skt, &frame, sizeof(frame));if (sizeof(frame) != rv) {perror("write can frame failed");break;} else {printf("send count : %d \n", ++index);sleep(1); // 1 second            }}close(skt);return 0;
}

  2.2 CAN 接收数据 代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>int main(int argc, char* argv[]) {int skt = socket(PF_CAN, SOCK_RAW, CAN_RAW);if (0 > skt) {perror("create socket error");return -1;}// 指定 can0 设备struct ifreq ifr = { 0 };strcpy(ifr.ifr_name, "vcan0");ioctl(skt, SIOCGIFINDEX, &ifr);struct sockaddr_can addr = { 0 };addr.can_family = AF_CAN;addr.can_ifindex = ifr.ifr_ifindex;// 将 can0 与套接字进行绑定int rv = bind(skt, (struct sockaddr*)&addr, sizeof(addr));if (0 > rv) {perror("bind error");close(skt);return -2;}// 设置过滤规则// setsockopt(skt, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);// 接收数据struct can_frame frame = { 0 };while (true) {rv = read(skt, &frame, sizeof(struct can_frame));if (rv < 0) {perror("read can frame error");break;}// 校验是否接收到错误帧if (frame.can_id & CAN_ERR_FLAG) {printf("error can frame \n");break;}// 校验帧格式if (frame.can_id & CAN_EFF_FLAG) {printf("扩展帧 <0x%08x> ", frame.can_id & CAN_EFF_MASK);} else {printf("标准帧 <0x%03x> ", frame.can_id & CAN_SFF_MASK);}// 校验帧类型:数据帧还是远程帧if (frame.can_id & CAN_RTR_FLAG) {printf("remote request frame \n");continue;}// 打印数据printf("[%d] ", frame.can_dlc);for (int idx = 0; idx < frame.can_dlc; idx++) {printf("%02x ", frame.data[idx]);}   printf("\n");}close(skt);return 0;
}

  2.3 CMakeLists.txt 代码

cmake_minimum_required(VERSION 3.0)# 设置统一输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)# 设置统一链接目录
link_directories(${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
link_directories(${CMAKE_LIBRARY_OUTPUT_DIRECTORY})# 主要工程项目
add_executable(vcan_recv vcan_recv.cpp)
add_executable(vcan_send vcan_send.cpp)

   2.4 虚拟 CAN 收发测试

  
三、VCAN 的其它操作
 

 安装 can 工具:sudo apt install can-utils
 

  3.1 启用 VCAN

# 启用 CANsudo ip link set vcan0 up

  3.2 关闭 VCAN

# 关闭 CANsudo ip link set vcan0 down

  3.3 重启 VCAN

# 重启CANsudo canconfig vcan0 restart

  3.4 停止 VCAN

# 停止CANsudo canconfig vcan0 stop

  3.5 设备波特率

# 设置波特率sudo ip link set vcan0 up type can bitrate 250000

  3.6 显示 VCAN 详细信息

# 显示 CAN 详细信息sudo ip -details link show vcan0

 3.7 VCAN 回环测试

# 回环测试sudo canconfig vcan0 ctrlmode loopback on

 3.8 发送 VCAN 数据

# 向 CAN 总线发送数据sudo cansend vcan0 --identifier=ID+数据

  3.9 接收 VCAN 数据

# 接收 CAN 总线数据sudo candump vcan0

  3.10 查看 VCAN 状态

# 查看CAN总线状态sudo canecho vcan0

  3.11 VCAN 数据过滤

# 使用滤波器接收 ID 匹配的数据sudo candump vcan0 --filter=ID:mask

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缺失的第一个正数(LeetCode 41)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力4.2 排序4.3 哈希表4.4 空间复杂度为 O(1) 的哈希表4.5 置换 参考文献 1.问题描述 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级…

CSS基本知识

文章目录 1. CSS 是什么2. 基本语法规范3. 引入方式3.1 内部样式表3.2 行内样式表3.3 外部样式 4. 选择器4.1 选择器的功能4.2 选择器的种类4.3 基础选择器4.3.1 标签选择器4.3.2 类选择器4.3.3 id 选择器4.3.4 通配符选择器 4.4 复合选择器4.4.1 后代选择器4.4.2 伪类选择器 5…

Spring学习 Spring概述

1.1.Spring介绍 ​ Spring是轻量级Java EE应用开源框架&#xff08;官网&#xff1a; http://spring.io/ &#xff09;&#xff0c;它由Rod Johnson创为了解决企业级编程开发的复杂性而创建 1.2.简化应用开发体现在哪些方面&#xff1f; IOC 解决传统Web开发中硬编码所造成的…

Swagger Editor 教程:从入门到精通编写 API 文档

在 API 开发的领域中&#xff0c;Swagger 以其卓越的使用效率与便捷性&#xff0c;备受开发者欢迎。它是一个强大的接口设计工具&#xff0c;允许开发人员对 RESTful API 进行高效的设计、构建及测试工作。本文旨在深入探讨其中一个子工具——Swagger Editor的使用介绍及它的有…

AIGC时代-GPT-4和DALL·E 3的结合

在当今这个快速发展的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了我们生活中不可或缺的一部分。从简单的自动化任务到复杂的决策制定&#xff0c;AI的应用范围日益扩大。而在这个广阔的领域中&#xff0c;有两个特别引人注目的名字&#xff1a;GPT-4和D…

代码随想录 718. 最长重复子数组

题目 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。 示例 2&#xff1…

计算机视觉入门与调优

大家好啊&#xff0c;我是董董灿。 在 CSDN 上写文章写了有一段时间了&#xff0c;期间不少小伙伴私信我&#xff0c;咨询如何自学入门AI&#xff0c;或者咨询一些AI算法。 90%的问题我都回复了&#xff0c;但有时确实因为太忙&#xff0c;没顾得过来。 在这个过程中&#x…

【Java】LockSupport原理与使用

LockSupport&#xff1a; 关键字段&#xff1a; private static final sun.misc.Unsafe UNSAFE;private static final long parkBlockerOffset; Unsafe&#xff1a;"魔法类"&#xff0c;较为底层&#xff0c;在LockSupport类中用于线程调度(线程阻塞、线程恢复等)。…

模板模式实现分布式锁实战

前言 分布式锁相信大家都有用过&#xff0c;常见的分布式锁实现方式例如redis、zookeeper、数据库都可以实现&#xff0c;而我们代码中强引用这些分布式锁的代码&#xff0c;那么当我们以后想替换分布式锁的实现方式时&#xff0c;需要修改代码的成本会很高&#xff0c;于是我…

ChatGPT怎么帮我上班的

1.解放生产力 1&#xff09;标准格式&#xff0c;完美输出。GPT对于公文等具有一定标准格式的文件&#xff0c;可以进行完美仿写&#xff0c;随随便便以假乱真那都是小菜一碟&#xff0c;这对于经常要开展规范成文的人来说&#xff0c;简直就是个福音&#xff0c;只要前期调教…

pyqt5用qtdesign设计页面时,去掉页面的空白界面、边框和标题栏

前言 Windows默认的标题栏有时候自己觉得不太美观&#xff0c;就想自己设计一个&#xff0c;然后把默认的去掉&#xff0c;并且把长方形的边框和多余的空表界面去掉&#xff0c;就是下图中圈出来的区域&#xff1a; 去掉之后的效果如图&#xff1a; 这样我们就可以自定义窗…

面试算法89:房屋偷盗

题目 输入一个数组表示某条街道上的一排房屋内财产的数量。如果这条街道上相邻的两幢房屋被盗就会自动触发报警系统。请计算小偷在这条街道上最多能偷取到多少财产。例如&#xff0c;街道上5幢房屋内的财产用数组[2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;3]表示…

php ext-sodium 拓展安装 linux+windows

php编译安装(linux)&#xff0c;可以参考&#xff1a;php编译安装 一、windows soduim源码包自带&#xff0c;直接修改php.ini&#xff0c;取消extensionsodium注释即可 二、linux 1.安装依赖 apt-get install libsodium-dev2.进入源码目录 这里写自己的源码目录 cd /us…

大数据规模存储的几个核心问题

文章目录 三个关键问题RAID&#xff08;独立磁盘冗余阵列&#xff09;RAID是如何解决关于存储的三个关键问题&#xff1f;水平伸缩 大规模数据存储都需要解决几个核心问题&#xff0c;这些问题都是什么呢&#xff1f; 三个关键问题 1.数据存储容量的问题 既然大数据要解决的…

Windows系统中Wireshark抓包工具的安装使用

在使用Windows服务器时&#xff0c;如果我们发现网络流量异常或存在异常的外发数据包行为&#xff0c;我们可以利用抓包工具来捕获网络流量包&#xff0c;并对这些流量包进行特征分析&#xff0c;以查看其来源和目的地。通过这些信息&#xff0c;我们可以进一步诊断问题。 以下…

人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…

如何快速定位php程序运行慢的地方

1 slow log日志 查看slowlog日志位置 编辑php-fpm.conf文件&#xff0c;更改或增加两行内容 slowlog /data/logs/php-slow.log request_slowlog_timeout 2 说明&#xff1a;slowlog定义日志路径和名字&#xff0c;request_slowlog_timeout定义超时时间&#xff0c;单位…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-6根轨迹Root locus

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-6根轨迹Root locus 1. 根的作用2. 手绘技巧3. 分离点/汇合点&根轨迹的几何性质 1. 根的作用 G ( s ) s 3 s 2 2 s 4 G\left( s \right) \frac{s3}{s^22s4} G(s)s22s4s3​…

线性代数 --- 为什么LU分解中L矩阵的行列式一定等于(+-)1?

以下是关于下三角矩阵L的行列式一定等于-1的一些说明 证明&#xff1a;在LU分解中&#xff0c;下三角矩阵L的行列式一定是. 在证明之前&#xff0c;我这里先补充几条关于行列式的性质&#xff1a; 性质1&#xff1a;对于三角矩阵而言&#xff0c;不论是上三角矩阵还是下三角矩…

<六>Python的字符串切片及常见操作

字符串的表示 在Python里&#xff0c;可以使用一对单引号、一对双引号或者一对三个双引号、一对三个单引号表示字符串。 a "Im Tom" # 一对双引号 b Tom said:"I am Tom" # 一对单引号c Tom said:"I\m Tom" # 转义字符d Tom said:"…