使用python-can和cantools实现arxml报文解析、发送和接收的完整指南

文章目录

  • 背景
  • 一、硬件支持
  • 二、环境准备
    • 1、python解释器安装
    • 2、python库安装
  • 三、 收发案例
  • 四、 方法拓展
    • 1、canoe硬件调用
    • 2、回调函数介绍
  • 结论


背景

在汽车行业中,CAN (Controller Area Network) 总线是用于车辆内部通信的关键技术。arxml文件是一种用于描述CAN消息和信号的标准格式。在本指南中,我们将介绍如何使用python-cancantools库来解析arxml文件,并在Python中发送和接收CAN消息,我大概以下面的逻辑去实现整个发送和接收的框架,CANMsgSender和CANMsgReceiver建议通过线程去实现。

在这里插入图片描述

一、硬件支持

1、python-can的库支持多种硬件,另外还支持虚拟接口,方便调试的时候使用。

点击查看python-can硬件介绍

在这里插入图片描述


二、环境准备

1、python解释器安装

1)请确保安装的python解释器大于3.8,因为我们在发送报文时会用到send periodic()函数,这个函数在python-can4.3.0版本之后才开始增加回调函数的方法(如下图示),当设定send_periodic(register_message,period = cycle_time,modifier_callback = update_msg_data),发送报文时会自动回调update_msg_data函数,我们可以在update_msg_data函数中更新报文数据。

点击查看python-can release信息

在这里插入图片描述

2、python库安装

1)首先,确保你的Python环境中已经安装了python-cancantools库,这里的python-can的版本一定要大于等于4.3.0。如果没有安装,可以使用pip进行安装:

pip install python-can
pip install cantools

三、 收发案例

这个例子可以简单地实现报文的发送与接收,这里我就不展示完整的代码了,因为每个人的需求都不一样,可以按上面提供的框架进行开发。

import can
import time
import cantools#创建虚拟总线对象
send_bus = can.interface.Bus('test', interface='virtual', preserve_timestamps=True)
recv_bus = can.interface.Bus('test', interface='virtual', preserve_timestamps=True)#cantools解析arxml
database = cantools.database.load_file('demo.arxml' , strict=False)#这个是send_periodic的回调函数,python-can会周期回调这个函数
#另外这个message还有其他属性
def update_msg_data(message):for msg in database.messages:if message.arbitration_id == msg.frame_id:#这里可以处理message的datamessage.data = message.dataprint(f"正在回调{message.arbitration_id}报文")                        if __name__ == "__main__":#注册周期报文for msg in database.messages:encode_data = []msg_data = None#判断是否含有pduif msg.is_container:for contain_msg in msg.contained_messages:#获取signal的字典,值就默认填0signals_dict = {signal.name : 0 for signal in contain_msg.signals}contain_msg_data = contain_msg.encode(signals_dict)encode_data.append((contain_msg,contain_msg_data))#获取报文的发送周期cycle_time = contain_msg.cycle_time if contain_msg.cycle_time is not None else 20#encode每个pdu的datamsg_data = msg.encode(encode_data)#如果是报文类型else:signals_dict = {signal.name : 0 for signal in msg.signals}cycle_time = msg.cycle_time if msg.cycle_time is not None else 20msg_data = msg.encode(signals_dict)#注册周期发送报文register_message = can.Message(timestamp=time.time(), arbitration_id=msg.frame_id, is_extended_id=msg.is_extended_frame, is_fd=True, data=msg_data)send_bus.send_periodic(register_message,period = cycle_time /1000,modifier_callback = update_msg_data)#循环接收报文database_msg_dict = {msg.frame_id : msg for msg in database.messages}while True:decode_msg_dict = {}recv_msg = recv_bus.recv()frame_id = recv_msg.arbitration_iddata = recv_msg.datatry:if database_msg_dict[frame_id].is_container:contain_msgs = database.decode_message(frame_id,data,decode_choices=False,decode_containers=True,allow_truncated=True)for contain_msg in contain_msgs:contain_msg_signals = contain_msg[1]if isinstance(contain_msg_signals,dict):decode_msg_dict.update(contain_msg[1])else:decode_msg_dict =  database.decode_message(frame_id,data,decode_choices=False,decode_containers=False)print(decode_msg_dict)except Exception as e:print(e)continue

循环打印结果:
在这里插入图片描述


四、 方法拓展

1、canoe硬件调用

1)这里以canoe为例,首先在canoe中定义Application pycan(这个名字随便取),然后再分配到真实的canoe通道中去。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2)修改通道定义

#send_bus = can.interface.Bus('test', interface='virtual', preserve_timestamps=True)
send_bus= can.interfaces.vector.canlib.VectorBus(app_name='pycan', channel=0, bitrate=500000, data_bitrate=2000000, fd=True)

3)其他硬件调用
点击查看python-can硬件介绍


2、回调函数介绍

1)回调函数中的message有其他属性,其他属性可以搭配cantools一起使用。

def update_msg_data(message):for msg in database.messages:if message.arbitration_id == msg.frame_id:#这里可以处理message的datamessage.data = message.dataprint(f"正在回调{message.arbitration_id}报文")       

在这里插入图片描述


结论

通过本指南,你应该能够理解如何使用python-cancantools库来处理CAN通信。这些库提供了强大的功能,可以帮助你在Python环境中轻松地实现CAN消息的发送和接收,以及arxml文件的解析。

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

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

相关文章

【数据结构】算法效率揭秘:时间与空间复杂度的较量

前言 在计算机科学中,时间复杂度和空间复杂度是衡量算法性能的两个重要指标。它们分别表示算法在执行过程中所需的时间和空间资源。了解这两个概念有助于我们评估和比较不同算法的优劣,从而选择更合适的算法解决问题~ 欢迎关注个人主页:逸狼 …

.github/workflows Actions为项目构建增加手动CI 构建按钮

在Github CI项目的时候, 一般是有push的时候才触发CI构建任务, 今天介绍一种通过 on workflow_dispatch 来增加手动CI构建按钮的方法。 CI构建任务代码示例 .github/workflows/ci.yml name: CIon:push:branches: [develop]pull_request:branches: [dev…

社区论坛小圈子小程序源码系统:自定义小程序管理社区圈子软件圈子系统系统开发-做社区圈子丨圈子论坛社区交友系统开源版小程序源码丨

简述 移动互联网的快速发展,微信小程序作为一种新型的应用形态,已经深入到人们的生活中。特别是对于社区论坛类应用,小程序版本可以更好地满足用户快速、便捷获取信息的需求。下面给大家分享一款社区论坛小圈子小程序源码系统。 在这个信息…

RTT设备驱动框架学习(CAN设备)

RTT设备框架属于组件和服务层,是基于RTT内核之上的上层软件。 设备框架是针对某一类外设,抽象出来的一套统一的操作方法及接入标准,可以屏蔽硬件差异,为应用层提供统一的操作方法。 RTT设备框架分为三层:设备驱动层、…

linux中如何挂载yum云仓库进行软件的安装

1.首先在根目录下建立文件,用来挂载镜像文件 [rootclient ~]# mkdir /rhel9 2.挂载镜像文件: [rootclient ~]# mount /dev/cdrom /rhel9 3.切换到 /etc/yum.repos.d 下的目录并查看 ,创建 rhel9.repo文件,并编辑云仓库域名&am…

Leetcode 410 分割数组

题目信息 LeetoCode地址: . - 力扣(LeetCode) 题目理解 将一个数组切k刀,每一块子数组求和,共k1个数,这里面有一个最大的数Max。找一种切法,使这个Max最小。 暴力解法一定是会超时的,因为包…

对前端路由的理解

在前端技术早期,一个 url 对应一个页面,如果要从 A 页面切换到 B 页面,那么必然伴随着页面的刷新。这个体验并不好,不过在最初也是无奈之举——用户只有在刷新页面的情况下,才可以重新去请求数据。 后来,改…

npm环境搭建

npm是什么 npm是前端的包管理工具,类似于后端的maven。现在npm已经集成到nodeJs中,安装好nodeJs就可以安装好npm了。 npm初始配置 一般下载好nodeJs后要对npm进行一些初始化配置。 修改npm的镜像源 npm默认的镜像源是https://registry.npmjs.org/&a…

西瓜书学习——线性回归

文章目录 基本格式线性回归一元线性回归多元线性回归 基本格式 f ( x ) w 1 x 1 w 2 x 2 . . . w d x d b f(x) w_1x_1 w_2x_2 ... w_dx_d b f(x)w1​x1​w2​x2​...wd​xd​b 一般可以表达为: f ( x ) w T x b f(x) w^Tx b f(x)wTxb w 和 b 可以通…

【前端】用CSS实现div全屏铺满的方式

在网页设计和开发中,有时我们需要让一个div元素全屏铺满整个浏览器窗口,以实现更加吸引人的视觉效果或者更好地适配不同设备的屏幕大小。 最近遇到一个需求,需要将一个div自动铺满全屏,width会默认铺满,所以不用考虑&…

LeetCode刷题总结 | 图论2—深度优先搜索广度优先搜索较为复杂应用

深搜广搜的标准模版在图论1已经整理过了,也整理了几个标准的套模板的题目,这一小节整理一下较为复杂的DFS&BFS应用类问题。 417 太平洋大西洋水流问题(medium) 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻…

opencv图像处理

1、图像膨胀腐蚀 图像的膨胀(dilation)和腐蚀(erosion)主要用来寻找图像中的极大区域和极小区域。 膨胀类似于“领域扩张”,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大。 腐蚀类似于“领域被蚕食”,将图像中的…

ElasticSearch有账号密码时: kibana配置

上一篇文章我们介绍过ElasticSearch关闭账号密码的的方式: config/elasticsearch.yml文件中 xpack.security.enabled: false 当我们关闭 账号密码,kibana是可以直接访问ElasticSearch的。 真实项目中,我们是不允许数据库裸跑的,所…

【前端甜点】某视频网站的m4s视频/音频下载方案(20240420)

引言 Sample:aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tL3ZpZGVvL0JWMWZKNDExUTdWeA 我在很久以前写过一个小脚本,发XHR请求来获取某视频网站的m4s视频和音频: // 唯一要改变的就是url(url must be https),a.download是文件名&#xff…

【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

基于CppHttpLib的Httpserver

1 背景 大多数嵌入式设备由于没有屏幕输出,只能通过Web页面来配置。这里利用CPPHttpLib来实现HttpServer。 2 HttpServer HttpServer是利用CPPHttpLib开源库实现的Http服务器CppHttpLib是基于C11的HTTP开源库,开源协议是MIT. CppHttpLib下载地址 2.1 …

(2022级)成都工业学院数据库原理及应用实验六: SQL DML(增、删、改)

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求,请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询: 1、在科室表…

神经网络进阶学习文章(一)

1.讲解YOLO有关知识 深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎 (zhihu.com) 2.目标检测算法综述 目标检测算法综述 - 知乎 (zhihu.com) 3.TensorFlow详解,当然现在用的最多的是Pytorch框架了 谷歌大神带你十分钟看懂TensorFlow - 知乎 (zhihu.co…

黑色主题个人主页HTML源码

源码介绍 黑色主题个人主页HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 效果预览 源码下载 黑色主题个人主页HTML源码

js的reduce

在JavaScript中,reduce() 是数组(Array)对象的一个方法,用于将数组中的所有元素归并成一个单一的输出值(通常是数字,但也可以是字符串或其他类型)。这个方法通过接收一个函数作为累加器&#xf…