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.mzph.cn/news/592217.shtml

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

相关文章

对比开源大语言模型的自然语言生成SQL能力

背景 NL-to-SQL&#xff08;自然语言到结构化查询语言&#xff09;任务是自然语言处理&#xff08;NLP&#xff09;领域的一个难题。 它涉及将自然语言问题转换为 SQL 查询&#xff0c;然后可以针对关系数据库执行该查询来回答问题。 该任务是 NLP 中的一个专门子领域&#xf…

test dbtest-00-数据库测试

拓展阅读 DbUnit-01-数据库测试工具入门介绍 database tool-01-flyway 数据库迁移工具介绍 数据库测试一直是一个痛点&#xff0c;测试的时候如何针对数据库测试呢? 数据库测试是确保数据库系统正确性、性能和可靠性的重要环节。以下是一些建议&#xff0c;可帮助您有效地…

Linux基础知识点(六-共享内存)

一、共享内存基本概念 什么是共享内存&#xff1f;顾名思义&#xff0c;共享内存就是将内存进行共享&#xff0c;它允许多个不相关的进程访问同一个逻辑内存&#xff0c; 直接将一块裸露的内存放在需要数据传输的进程面前&#xff0c;让它们自己使用。因此&#xff0c;共享内存…

C语言中灵活多变的动态内存,malloc函数 free函数 calloc函数 realloc函数

文章目录 &#x1f680;前言&#x1f680;管理动态内存的函数✈️malloc函数✈️free函数✈️calloc函数✈️realloc函数 &#x1f680;在使用动态内存函数时的常见错误✈️对NULL指针的解引用✈️ 对动态开辟空间的越界访问✈️对非动态开辟内存使用free释放✈️使用free释放一…

VirtualBox + Redhat7.6 +Oracle19C 数据库安装

软件工具&#xff1a; 虚拟化工具&#xff1a;VirtualBox-6.1.26-145957-Win.exe操作系统镜像&#xff1a;rhel-server-7.6-x86_64-dvd.iso远程连接工具&#xff1a;XmanagerPowerSuite-7.0.0004r.exe、SecureCRT 8.5.3数据库版本镜像&#xff1a;LINUX.X64_193000_grid_home.…

机器学习的几个需求层次

机器学习不是“屠龙之技”&#xff0c;它从诞生开始就立足于解决实际问题。你要解决什么样的问题&#xff0c;才决定你需要学习什么样的知识&#xff0c;以及学到什么程度。知道自己需要什么&#xff0c;带着目的去学习确实才是最有效率的。 结合实际问题&#xff0c;分享我对…

机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测

文章目录 机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测一、任务二、流程三、完整代码四、代码解析五、效果截图 机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测 随机梯度下降&a…

微服务整合:构建高效灵活的分布式系统

随着软件开发的不断演进和业务的复杂性增加&#xff0c;微服务架构已经成为一种流行的解决方案。然而&#xff0c;当涉及到多个微服务之间的整合时&#xff0c;我们需要谨慎考虑如何实现高效、灵活的分布式系统。 微服务架构的流行使得软件开发变得更加灵活和可扩展。然而&…

Android aar打包集成问题处理合集

一 概要 aar打包提供给使用方时&#xff0c;可能出现各种问题。譬如&#xff1a;接受方集成后发现编译报错。一般情况下主要有&#xff1a; 1.构建、kotlin语言、插件版本不一致&#xff1b; 2.相应的依赖版本不一致&#xff1b; 3. so库的ndk不一致或者不全&#xff1b;&…

Neuro Contamination - Cyberpunk Gaming Music Futuristic Glitchy Sci-fi

无论是展示赛博朋克未来的电影场景&#xff0c;还是介绍高科技武器&#xff0c;你的音乐选择都至关重要。这首曲子的灵感来自科幻小说&#xff0c;旨在让你的观众想象未来的感觉。 潜在用例&#xff1a;科幻游戏、赛博朋克游戏、电影预告片、动作场景和产品广告。 非常适合充…

【GitHub】ssh: connect to host github.com port 22: Connection refused

本地使用git上传GitHub仓库时发现的一个报错&#xff0c;以为是本机连不上github了&#xff0c;ping过后发现能够正常访问&#xff0c;于是上网找到了一个很完美的解决方案 原因&#xff1a;22端口被占用或被防火墙屏蔽 解决方法&#xff1a;切换GitHub的443端口 1.首先找到…

YOLOv8改进 | 检测头篇 | DynamicHead原论文一比一复现 (不同于网上版本,全网首发)

一、本文介绍 本文给大家带来的改进机制是DynamicHead(Dyhead),这个检测头由微软提出的一种名为“动态头”的新型检测头,用于统一尺度感知、空间感知和任务感知。网络上关于该检测头我查了一些有一些魔改的版本,但是我觉得其已经改变了该检测头的本质,因为往往一些细节上才…

json解析本地数据,使用JSONObject和JsonUtility两种方法。

json解析丨网址、数据、其他信息 文章目录 json解析丨网址、数据、其他信息介绍一、文中使用了两种方法作为配置二、第一种准备2.代码块 二、第二种总结 介绍 本文可直接解析本地json信息的功能示例&#xff0c;使用JSONObject和JsonUtility两种方法。 一、文中使用了两种方法…

分类预测 | Python实现基于SVM-RFE-LSTM的特征选择算法结合LSTM神经网络的多输入单输出分类预测

分类预测 | Python实现基于SVM-RFE-LSTM的特征选择算法结合LSTM神经网络的多输入单输出分类预测 目录 分类预测 | Python实现基于SVM-RFE-LSTM的特征选择算法结合LSTM神经网络的多输入单输出分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 基于SVM-RFE-LSTM的特征…

自定义指令:让 Vue 开发更有趣(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

WPF Blend for visual studio使用

Blend for visual studio介绍 VS自带的Blend for visual studio是专门用来做WPF、Metro等的界面设计的可视化工具&#xff0c;其功能和PS类似。其目的让做界面和后台的程序分开&#xff0c;能快速绘制形状和路径、修改对象样式、动态显示对象(动画)、显示数据等高级操作。VS与B…

FTP服务器安装、远程访问以及安全配置项

一、安装ftp 1、首先&#xff0c;确保您的系统已经更新到最新的软件包版本。运行以下命令来更新软件包列表并安装更新的软件包&#xff1a; sudo yum update 2、安装vsftpd服务器软件包&#xff1a; sudo yum install vsftpd 3、安装完成后&#xff0c;启动vsftpd服务并将…

音视频通信

文章目录 一、音视频通信流程二、流媒体协议1、RTSP2、RTMP3、HLS4、WebRTC 一、音视频通信流程 音视频通信完整流程有如下几个环节&#xff1a;采集、编码、前后处理、传输、解码、缓冲、渲染等。 每一个细分环节&#xff0c;还有更细分的技术模块。比如&#xff0c;前后处…

认识机器学习【woodwhales.cn】

为了更好的阅读体验&#xff0c;建议移步至笔者的博客阅读&#xff1a;认识机器学习 生活中的问题1&#xff1a;居民家庭生活用气价格 北京燃气小程序在线咨询&#xff0c;查询北京居民家庭生活用气价格 上图价格梯度&#xff0c;可以由文字转换成表格&#xff1a; 第一档用气…

linux 内核编译安装

一、配置 默认配置 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- omap2plus_defconfig原配置 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- oldconfig 重新配置 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- menuconfig二 kernel zImage make ARCHarm CRO…