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

这篇具有很好参考价值的文章主要介绍了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 进行通讯测试。文章来源地址https://www.toymoban.com/news/detail-774268.html

一、启用本机的 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

# 启用 CAN
  sudo ip link set vcan0 up

  3.2 关闭 VCAN

# 关闭 CAN
  sudo ip link set vcan0 down

  3.3 重启 VCAN

# 重启CAN
  sudo canconfig vcan0 restart

  3.4 停止 VCAN

# 停止CAN
  sudo 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

到了这里,关于Ubuntu20.04 上启用 VCAN 用作本地调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu20.04一键安装VScode搭建ROS编程环境

    VSCode 全称 Visual Studio Code,是微软出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。

    2023年04月24日
    浏览(50)
  • 没有U盘电脑如何使用本地硬盘安装Ubuntu20.04(双系统)

    DELL7080台式机 联想 E14笔记本 Win10专业版 Ubuntu20.04 两块硬盘一块固态一块机械 一块固态硬盘128G 没有U盘Win10电脑下如何使用本地硬盘安装Ubuntu20.04(单双硬盘都行) 双硬盘安装 一、下载镜像文件 1.自行下载安装镜像文件 二、分区 1.Win10下磁盘管理压缩2个分区一个10G左右制作安

    2024年02月09日
    浏览(57)
  • Ubuntu20.04本地部署Stable-Diffusion-webui AI绘画环境

    最近AI绘画很火,所以想在本地部署个环境体验一下。原本打算在Windows下安装,网上有很多教程,也有很多大佬做了整合包,可是我的Windows系统下的显卡驱动版本太低,也没法升级,只能装CUDA9,导致安装torch会出现问题。所以考虑在Ubuntu下安装,参考了几篇文章,所幸也安

    2023年04月11日
    浏览(87)
  • 【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】

    最近在使用一直在调试ESP32,作为新手,也有很多不懂的地方,一点点慢慢学,开始是装的win环境,后来又尝试了jetson-orin-nx和ubuntu上,在Linux 下开发都习惯使用命令行,但是在Windows下习惯使用软件点,而调试esp32的话,还是建议使用命令行形式。 当然说得有点远了,本次主要

    2024年02月08日
    浏览(43)
  • Ubuntu18.04 升级Ubuntu20.04

    因项目环境需要,欲将Ubuntu18.04升级至Ubuntu20.04,参考网上其他小伙伴的方法,也遇到了一个问题,特此记录一下,希望能帮助其他有同样问题的小伙伴。 参考:第十五章 Ubuntu18.04LTS升级到20.04LTS 主要的步骤: 在执行“do-release-upgrade”时,遇到“Failed to connect to https://changel

    2024年02月02日
    浏览(59)
  • Ubuntu20.04升级到Ubuntu 22.04

    执行如下命令将Ubuntu升级到最新的版本: 升级完成后,重启系统 重启成功之后,查看系统的当前版本 最新版本应该是20.04.6,如下图所示。 执行如下命令开始升级 一路yes或确认即可,下面是一些过程中的操作。 所有当前 Ubuntu 20.04 的源列表文件将被 Ubuntu 22.04 的 jammy 源列表

    2024年02月17日
    浏览(51)
  • Ubuntu20.04配置

    新创建的用户没有root权限,我们执行以下命令给用户sudo权限 删除用户及用户所有文件(/home/username/路径下的所有文件) 删除用户但保留所有用户文件: 查询系统整体磁盘使用情况: df -h 查询指定目录的磁盘占用情况:默认是当前目录 du -h

    2024年02月04日
    浏览(51)
  • ubuntu20.04网络配置

    安装net-tools      sudo apt-get install net-tools 2、ifconfig查看网卡设备 其中flags表中:running表示正在使用中。 查看设备核心网络路由表:      route -n Destination 目标网段或者主机 Gateway 网关地址,”*” 表示目标是本主机所属的网络,不需要路由 Genmask 网络掩码 Flags 标记。

    2024年02月08日
    浏览(63)
  • Ubuntu 20.04桌面美化

    文章目录 前言 1 安装美化软件 1.1 更新软件源 1.2 安装tweak工具 1.3 安装gnome扩展模块 1.4 tweak预配置 2 主题美化 2.1 主题下载 2.2 主题设置 3 图标美化 3.1 图标下载 3.2 图标设置 4 任务栏美化 4.1 安装扩展 4.2 安装插件 总结 最近将开发环境更新到了 Ubuntu 20.04 ,相对于 Ubuntu 18.04 确

    2024年02月08日
    浏览(45)
  • Ubuntu20.04分区方案

    本人电脑是 500G 固态硬盘 + 2T 机械硬盘 ,我只装了Ubuntu一个系统,如果是双系统,可以将500G固态硬盘分成250G+250G两块,分别安装一个系统!!大家可以根据自己电脑硬件配置进行调整 分区名称 选择分区 文件系统类型 空间大小 描述 efi系统分区 逻辑分区 XXX 4G efi是UEFI引导,它

    2024年02月16日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包