CANopen中错误帧的制造和观测

news2024/10/28 7:07:19

本文讲述如何制造和观察CANopen中的错误帧(Error frame),以Linux下的“VCAN0”为CAN接口来做测试,所以事先要先创建vcan0


一 制造错误帧

首先安装python CAN,

pip3 install python-can

然后参考python can的文档编写如下代码,保存为error_frame.py,

import can

# 连接vcan0
can_bus = can.Bus(channel='vcan0', interface='socketcan')

# 创建错误帧
err_frame = can.Message(arbitration_id=100, is_error_frame=True)

# 打印错误帧
print(err_frame)

# 向vcan0发送错误帧
can_bus.send(err_frame)

# 关闭连接
can_bus.shutdown()

二 观察错误帧

使用candump

candump是用来观察CAN消息的非常方便的工具,安装命令如下,

sudo apt install can-utils

通过查看candump的help信息,有如下这段话,

![[Pasted image 20241027170641.png]]

我们平时用candump可能只是执行candump vcan0这样,或者偶尔加个过滤,而其提供的例子里已经告诉我们如何观察错误帧。下面让我们来观察错误帧。

首先打开一个终端,然后执行下面命令,

candump any,0~0,#FFFFFFFF

接着打开另外一个终端运行第一节的python脚本,

python3 error_frame.py

此时可以在candump所在终端观察到如下信息,
![[Pasted image 20241027171813.png]]

使用C代码

下面是一段典型的C代码,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <linux/can/raw.h>
#include <linux/can/error.h>
#include <linux/can.h>
#include <net/if.h>

int main(void) {
    int s;
    struct sockaddr_can addr;
    struct ifreq ifr;
    struct can_frame frame;

    // 创建套接字
    s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
    if (s == -1) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 设置CAN设备
    strcpy(ifr.ifr_name, "vcan0"); // 使用vcan0作为设备名
    ioctl(s, SIOCGIFINDEX, &ifr);

    can_err_mask_t err_mask = ( CAN_ERR_TX_TIMEOUT | CAN_ERR_BUSOFF );
    setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask));


    // 绑定套接字到CAN设备
    memset(&addr, 0, sizeof(addr));
    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;
    if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
        perror("Bind failed");
        close(s);
        exit(EXIT_FAILURE);
    }

    // 接收数据
    while (1) {
        int len = recvfrom(s, &frame, sizeof(frame), 0, NULL, NULL);
        if (len > 0) {
            // 检查是否为错误帧
            if ((frame.can_id & CAN_ERR_FLAG) != 0) {
                printf("Error Frame received!\n");
            } else {
                printf("Standard Frame: ID=0x%03X DLC=%d\n", frame.can_id & CAN_SFF_MASK, frame.can_dlc);
                for(int i = 0; i < frame.can_dlc; i++) {
                    printf("%02X ", frame.data[i]);
                }
                printf("\n");
            }
        }
    }

    close(s); // 不会执行到这里,因为上面的循环是无限的
    return 0;
}

代码里使用setsockopt()设置了观察的错误帧类型,即CAN_ERR_TX_TIMEOUT 和CAN_ERR_BUSOFF,意思就是出现这2种错误帧才会去处理,这2个宏定义的值分别是0x1和0x40,而前面python脚本里的设置错误帧id是0x64,与0x40相与后不是0,所以会被认为是CAN_ERR_BUSOFF

编译这段C代码,然后运行,接着执行python脚本,这样就可以在C程序这边观察到打印,
在这里插入图片描述

可以试着把python脚本里的id改成别的值,可以不触发错误帧检测。


三 小结

本文讲述如何使用python can来制造错误帧,以及如何使用candump和C代码来观察错误帧,了解了这些知识后就可以随意制造想要的错误帧来做测试,非常方便。

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

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

相关文章

Android View

前面我们了解了Android四大组件的工作流程&#xff0c;Android中还存在一个和四大组件地位相同的概念&#xff1a;View&#xff0c;用于向用户页面展示内容。我们经常使用的TextView、Button、ImageView控件等都继承于它&#xff0c;也会自定义View实现自定义效果。View类源码内…

2024CSP-J题目简析

扑克牌 1.题目大意&#xff1a;给定n张扑克牌和这n张扑克牌的花色和大小&#xff08;可能会有重复&#xff09;&#xff0c;需要输出还需要多少张牌才能凑齐一副扑克牌&#xff08;这里不考虑大小王&#xff0c;所以共52张&#xff09;。 2.思路概要&#xff1a;由于扑克牌会…

C++ | Leetcode C++题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; class Solution { public:int findBottomLeftValue(TreeNode* root) {int ret;queue<TreeNode *> q;q.push(root);while (!q.empty()) {auto p q.front();q.pop();if (p->right) {q.push(p->right);}if (p->left) {q.push(…

配置smaba (Linux与windows通信)

在Ubuntu上安装Samba是一个简单的过程。以下是详细的步骤&#xff0c;帮助你从安装到基本配置。 步骤1&#xff1a;更新软件包列表 首先&#xff0c;打开终端&#xff0c;确保你的软件包列表是最新的&#xff1a; sudo apt update 步骤2&#xff1a;安装 Samba 接下来…

若依学习 后端传过来的数据在控制台打印为空

导言: 在做若依二次开发时遇到个没见过的bug&#xff0c;用了一些时间排&#xff0c;发现有自己没学过的东西。所以记录一下。后端用的是c#的asp.net core 问题描述&#xff1a; 后端穿过来的有数据的参数(数组)roleIds在控制台打印为空 后端字段定义: 后端数据&#xff1a; 前…

centos-LAMP搭建与配置(论坛网站)

文章目录 LAMP简介搭建LAMP环境安装apache&#xff08;httpd&#xff09;安装mysql安装PHP安装php-mysql安装phpwind LAMP简介 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1a;Linux操作系统&#xff0c;网页服务器Apache&#xff0c;…

【LangChain系列3】【检索模块详解】

目录 前言一、LangChain1-1、介绍1-2、LangChain抽象出来的核心模块1-3、特点1-4、langchain解决的一些行业痛点1-5、安装 二、检索模块详解2-1、文档加载器2-1-1、Demo示例2-1-2、JSON加载2-1-3、CSV加载 2-2、文档转换器2-2-1、按字符进行拆分2-2-2、按代码分割2-2-3、Markdo…

arm 体系架构-过程调用标准AAPCS

一、什么是AAPCS&#xff1f; 旧时&#xff0c;ARM 过程调用标准叫做 APCS (ARM Procedure Call Standard)&#xff0c;Thumb的过程调用标准为 TPCS。如今这两种叫法已经废弃&#xff0c;统一称作 AAPCS (Procedure Call Standard for the ARM Architecture)。 AAPCS 是 ARM …

UE5之5.4 第三人称示例代码阅读

第三人称的代码相对第一人称少了很多&#xff0c;只有一个移动跳跃的能力 构造函数&#xff0c;添加角色的移动属性&#xff0c;限制了当controller移动角色不会乱转&#xff0c;然后创建了一个相机杆&#xff0c;创建了一个跟随相机&#xff0c;绑到相机杆上 然后在这个函数设…

用二分法查找有序容器的插入点

例子&#xff1a; int main() {vector<int> vec { 1,2,3,4,5,7,8,9 };auto n alg.find_binary_insert_pos(vec.begin(), vec.end(), 6);vec.insert(vec.begin() n, 6);_pn(vec);list<int> lst { 1,10,11,9,5 };for (auto& v : lst) {//添加不存在的元素au…

241024-Ragflow离线部署Docker-Rootless环境配置修改

A. 最终效果 B. 文件修改 docker-compose.yml include:- path: ./docker-compose-base.ymlenv_file: ./.envservices:ragflow:depends_on:mysql:condition: service_healthyes01:condition: service_healthyimage: ${RAGFLOW_IMAGE}container_name: ragflow-serverports:- ${…

D50【python 接口自动化学习】- python基础之类

day50 init方法 学习日期&#xff1a;20241027 学习目标&#xff1a;类 -- 64 init方法&#xff1a;如何为对象传递参数&#xff1f; 学习笔记&#xff1a; 魔术方法 init方法 class Klass(object):# 定义初始化方法&#xff0c;类实例化时自动进行初始化def __init__(self…

autMan框架的指令转换功能学习

以正则表达式为基础 一、基本用法【简单替换】 示例1&#xff1a; 匹配表达式&#xff1a;激活 结果表达式&#xff1a;咖啡码 效果&#xff1a;只要命令中包含“激活”这两个字&#xff0c;就会将命令中所有的“激活”替换为“咖啡码”&#xff0c;即你从后台看到收到的命令是…

leetcode-64-最小路径和

题解&#xff1a; 以题中矩阵为例&#xff1a; &#xff08;1&#xff09;走到grid[0][0]的最小距离就是起点grid[0][0]即dp[0][0]grid[0][0]; &#xff08;2&#xff09;走到grid[0][1]的最小距离&#xff1a;dp[0][1]grid[0][0]grid[0][1]; &#xff08;3&#xff09;走到…

《神经网络助力战场车辆及部件损毁识别与评估》

《神经网络助力战场车辆及部件损毁识别与评估》 一、战场车辆损毁评估的重要意义二、传统战场车辆损毁评估方法&#xff08;一&#xff09;视觉评估法&#xff08;二&#xff09;仪器检测技术 三、神经网络在战场车辆损毁评估中的应用案例&#xff08;一&#xff09;射击毁伤评…

WPF+MVVM案例实战(七)- 系统初始化界面字体描边效果实现

文章目录 1、案例效果展示2、项目准备3、功能实现1、资源获取2、界面代码3、后台代码 4 源代码获取 1、案例效果展示 2、项目准备 打开项目 Wpf_Examples&#xff0c;新建系统初始化界面 WelcomeWindow.xmal,如下所示&#xff1a; 3、功能实现 1、资源获取 案例中使用的CSD…

VMware Workstation Pro 17 安装 Centos 7.9 虚拟机

下面以使用VMware Workstation Pro 17.5.2版本进行安装&#xff0c;CentOS版本为7.9&#xff0c;7.x的原来很多地址失效了&#xff0c;因为旧版移到了vault目录。为了方便大家整理可用的下载地址&#xff1a;清华大学镜像站 新建虚拟机 下面是填写的虚拟机的名称和路径&#x…

拴柱说Mac之Mac的高效使用技巧第二期

Mac的触控板想必大家都会使用&#xff0c;比如三指拖移窗口&#xff0c;四指切换桌面&#xff0c;触控板能做到的其实更多&#xff0c;今天的高效使用技巧讲的就是触控板&#xff0c;如何才能让你的触控板更加的好用 第一步&#xff0c;官网下载BetterAndBetter 第二步&#…

部署前后端分离若依项目--CentOS7Docker版

一、准备 centos7虚拟机或服务器一台 若依前后端分离项目&#xff1a;可在下面拉取 RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 二、环…

【Python爬虫】获取汽车之家车型配置附代码(2024.10)

参考大哥&#xff0c;感谢大哥&#xff1a;https://blog.csdn.net/weixin_43498642/article/details/136896338 【任务目标】 工作需要想更方便地下载汽车之家某车系配置清单&#xff1b;&#xff08;垃圾汽车之家不给下载导出表格&#xff0c;配置页叉掉了车系要出来还要重新…