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

server/2024/10/20 10:03:16/

文章目录

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


背景

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

在这里插入图片描述

一、硬件支持

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

点击查看python-can硬件介绍

在这里插入图片描述


二、环境准备

python_19">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信息

在这里插入图片描述

python_26">2、python库安装

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

pip install python-can
pip install cantools

三、 收发案例

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

python">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)修改通道定义

python">#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一起使用。

python">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.ppmy.cn/server/7610.html

相关文章

什么是持续集成系统?

持续集成(Continuous Integration,简称CI)是一种软件开发实践,在这种实践中,开发人员会频繁地(可能每天多次)将代码集成到共享的代码库中。每次代码提交后,自动执行构建和测试流程&a…

Pytorch或Tensorflow 深度学习库安装 (简易版)

Tensorflow 2.X安装 0、 pytorch 支持 conda虚拟环境 cuda 和 cudnn1、创建conda环境2、测试GPU是否可用3、在机器上安装cuda 和 cudnnCUDA 安装cudnn 安装 0、 pytorch 支持 conda虚拟环境 cuda 和 cudnn 如果只用pytorch, 只需在虚拟环境安装cuda 和 cudnn即可&am…

【Hadoop】- YARN概述[6]

目录 一、YARN & Reduce 二、分布式资源调度 - YARN 1、资源调度 2、YARN的资源调度 总结 一、YARN & Reduce MapReduce是基于YARN运行的,即没有YARN “无法” 运行MapReduce程序。 二、分布式资源调度 - YARN YARN(Yet Another Resou…

基于 Spring Boot 博客系统开发(一)

基于 Spring Boot 博客系统开发(一) 本系统是简易的个人博客系统开发,为了更加熟练地掌握SprIng Boot 框架及相关技术的使用。🤓🤓🤓 本系统开发所需的环境及相关软件 操作系统:Windows Java…

鸿蒙OpenHarmony【轻量系统编写“Hello World”程序】 (基于Hi3861开发板)

编写“Hello World”程序 下方将通过修改源码的方式展示如何编写简单程序,输出“Hello world”。请在下载的源码目录中进行下述操作。 前提条件 已参考鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到…

mysql基础16——游标

游标 能够对结果集中的每一条记录进行定位 并对指向记录中的数据进行操作的数据结构 游标只能在存储程序内使用 存储程序包括存储过程和存储函数 创建存储函数 create function 函数名称 (参数) returns 数据类型 程序体 存储函数与存储过程的区别 存储函数必须返回一个值…

nlp(6)--构建找规律模型任务

前言 仅记录学习过程,有问题欢迎讨论 包含了两个例子 第一个为5分类任务 第二个为2分类任务 Demo1比Demo2难一点,放上边方便以后看。 练习顺序为 Demo2—>Demo1 代码 DEMO1: """ 自定义一个模型 解决 5分类问题 问题如下&#xf…

Gamba:将高斯溅射与Mamba结合用于单视图3D重建

Gamba: Marry Gaussian Splatting with Mamba for Single-View 3D Reconstruction Gamba:将高斯溅射与Mamba结合用于单视图3D重建 Qiuhong Shen11  Xuanyu Yi31 Zike Wu31  Pan Zhou2,42 Hanwang Zhang3,5 沈秋红 1 易轩宇 3 吴子可 3 潘周 2,4 2 张汉旺 3,5Shu…