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.hqwc.cn/news/309134.html

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

相关文章

【AI导师】利用Coding Agent完成AIGC编程

利用Coding Agent完成AIGC编程 一、前言二、Coding Agent三、1024code四、AI导师README项目初版功能定义代码结构设计方案函数方法设计方案迭代记录 一、前言 AI产品的发展确实在过去两年年中取得了显著进展&#xff0c;尤其是在编程领域。一开始&#xff0c;ChatGPT和类似的语…

【三维目标检测/自动驾驶】IA-BEV:基于结构先验和自增强学习的实例感知三维目标检测(AAAI 2024)

系列文章目录 论文&#xff1a;Instance-aware Multi-Camera 3D Object Detection with Structural Priors Mining and Self-Boosting Learning 地址&#xff1a;https://arxiv.org/pdf/2312.08004.pdf 来源&#xff1a;复旦大学 英特尔Shanghai Key Lab /美团 文章目录 系列文…

lag-llama源码解读(Lag-Llama: Towards Foundation Models for Time Series Forecasting)

Lag-Llama: Towards Foundation Models for Time Series Forecasting 文章内容&#xff1a; 时间序列预测任务&#xff0c;单变量预测单变量&#xff0c;基于Llama大模型&#xff0c;在zero-shot场景下模型表现优异。创新点&#xff0c;引入滞后特征作为协变量来进行预测。 获得…

偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析

OpenAI paper: InstructGPT, Training language models to follow instructions with human feedback paper: Learning to summarize from human feedback Introducing ChatGPT 解密Prompt系列4介绍了InstructGPT指令微调的部分&#xff0c;这里只看偏好对齐的部分 样本构建…

Large-Precision Sign using PBS

参考文献&#xff1a; [CLOT21] Chillotti I, Ligier D, Orfila J B, et al. Improved programmable bootstrapping with larger precision and efficient arithmetic circuits for TFHE[C]//Advances in Cryptology–ASIACRYPT 2021: 27th International Conference on the T…

const变量真的不能修改吗?

文章目录 1 在Linux系统下1.1 系统参数1.2 通过指针修改&#xff08;编译器有警告&#xff09; 2 在Windows下2.1 系统参数2.2 直接修改2.3 指针间接修改2.4 指针间间接修改 3 总结&#xff1a; 1 在Linux系统下 1.1 系统参数 内核&#xff1a;Linux version 3.2.0-24-generi…

【软件工程】漫谈增量过程模型:软件开发的逐步之道

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 增量过程模型&#xff08;Incremental Process Model&#xff09; 主要特点和阶段&#xff1a; 优点&#xff1…

模板 BIEE(二):Web日志从分析出发,在web页查看取数的sql方法

1 说明 1.1 环境 BIEE: Oracle Business Intelligence Enterprise Edition(Oracle商业智能企业版) 版本: OBIEE 12c Server 版本: 基于Oracle Analytics Server 6.4.0 版本 模板: 制造→生产成本→按前 10 个 GL 帐户列出的生产成本 1.2 背景 由《模板 BIEE (一):…

Python:爬虫获取微信公众号里面的表格内容+整理数据导出表格

前言 需求&#xff1a;统计深圳市各大剧场的钢琴表演节目的信息数据 有位朋友&#xff0c;他兼职了某个研究院&#xff1b;给他了一个任务就是统计深圳市内各大剧场的钢琴表演节目信息的数据。这件事情让他头疼&#xff0c;哈哈哈哈 跟我说了以后&#xff0c;我立刻想到用pyt…

MYSQL数据库安全性练习题

Mysql数据库实验及练习题相关 MySQL 数据库和表的管理-数据库实验一 MySQL连接查询、索引、视图-数据库实验二、实验三 MySQL约束、触发器-数据库实验四 MYSQL存储过程和存储函数-数据库实验五 MySQL批量随机生成name、TEL、idNumber MYSQL数据库的安全管理-数据库实验六 MYSQ…

JavaEE - 网络编程之回显服务器

目录 一.什么是回显服务器&#xff1f; 二.UDP是什么&#xff1f; 1.TCP 是有链接的&#xff0c; UDP 是无连接的 2.TCP是可靠传输的,UDP是不可靠传输的 3.TCP是面向字节流的&#xff0c;UDP是面向数据报 4.TCP和UDP是全双工的 三.UDP的 socket api 四. 具体代码实现 …

JavaScript:正则表达式

JavaScript&#xff1a;正则表达式 什么是正则表达式正则表达式语法定义正则表达式判断是否有匹配的字符串查找匹配的字符串 正则表达式匹配法则元字符边界符量词字符类 什么是正则表达式 正则表达式用于匹配字符串中字符的组合模式。 正则表达式会依据其自身语法&#xff0c;…