Python脚本实现通过Vector VN1630A CAN盒子与ECU通信

1 安装 python-can 包

安装命令如下:

pip install python-can

安装完成后可用下面命令查看是否安装成功及版本。

pip show python-can
Name: python-can
Version: 4.4.2
Summary: Controller Area Network interface module for Python
Home-page: https://github.com/hardbyte/python-can
Author: python-can contributors
Author-email:
License: LGPL v3
Location: D:\python3\Lib\site-packages
Requires: packaging, pywin32, typing-extensions, wrapt
Required-by:

2 创建 Vector Hardware Application

Vector VN1630A 硬件如下图:
在这里插入图片描述




打开控制面板,找到Vector Hardware选项,点击进入配置界面。
在这里插入图片描述
当硬件设备VN 1630A未插入电脑时,
在这里插入图片描述
插入硬件设备插入时,
在这里插入图片描述

创建一个新的 Application.
在这里插入图片描述
在这里插入图片描述
输入Application Name,然后点击OK即可。例如 创建了一个名为 FctTool 的Application,包含两个CAN通道。

3 分配硬件设备通道给 Application

将 VN1630A 的 channel 1分配给 FctTool 的 CAN 1(下图因为已经分配过了,所以只显示 CAN 2),将 VN1630A 的 channel 2分配给 FctTool 的 CAN 2。
在这里插入图片描述
最终如下:
在这里插入图片描述

4 编程实现

完整代码如下:

import can
from can.interfaces.vector import VectorBus

def prase_can_msg(msg):
    message_str = str(msg)
    parts = message_str.split()
    # print("parts:", parts)

    try:
        err_frame = parts.index('E')
        # print("Error frame found at index:", err_frame)
        return None, None, None
    except Exception as e:
        # print("Error frame not found:", e)
        pass

    # 提取Timestamp
    timestamp = float(parts[1])
    # 提取ID
    msg_id = int(parts[3].strip(), 16)
    # 提取DLC(数据长度)
    dlc_index = parts.index('DL:') + 1
    dlc = int(parts[dlc_index].strip())
    # 提取数据字段
    data_index = parts.index('DL:') + 2
    data1 = parts[data_index:data_index+dlc]
    data = [int(x, 16) for x in data1]
    # 提取Channel
    channel_index = parts.index('Channel:') + 1
    channel = int(parts[channel_index].strip())

    hex_data = ' '.join('0x%02x' % i for i in data)
    print("Timestamp          channel   msg_id   dlc                   data")
    print(f"{timestamp:10.6f} {channel:5d} {msg_id:9X} {dlc:6d}     {hex_data}")

    return msg_id, dlc, data

def detect_device_exist():
    # 检测Vector 1603A设备是否存在
    device_exist = False
    try:
        configs = can.detect_available_configs(interfaces=['vector'])
        for config in configs:
            if config['vector_channel_config'].name == 'VN1630A Channel 1':
                device_exist = True
                break
    except Exception as e:
        print("Detect available configs Error:", e)

    app_exits = False
    try:
        app_cfg = VectorBus.get_application_config(app_name='FctTool', app_channel=0)
        if app_cfg is not None:
            app_exits = True
            print("app_cfg:", app_cfg)
    except can.interfaces.vector.exceptions.VectorInitializationError as e:
        print("Get application config Error:", e)
    
    if device_exist and app_exits:
        return True

    # 如果没有找到Vector 1603A设备,则返回False
    return False

def vector_init():
    if not detect_device_exist():
        print("Vector 1603A device not found.")
        return None

    # 创建CAN总线对象,指定Vector 1603A接口
    try:
        # app_name 要和控制面板 Vector Hardware里面配置的名字一致,这里的 channel 要配置为0, 对应实际的 CAN 1 通道
        bus = can.Bus(interface='vector', channel=0, bitrate=500000, app_name="FctTool")
        print("bus type:", type(bus))
    except Exception as e:
        print("Create CAN bus object Error:", e)

    try:
        return bus
    except UnboundLocalError as e:
        print("Return CAN bus object Error:", e)
        print("Error: CAN bus channel is used by other application.")
        return None
    else:
        print("Other error.")

def vector_send_msg(bus, msg_id, message, dlc):
    # 发送CAN消息
    msg = can.Message(arbitration_id=msg_id, dlc=dlc, data=message, is_extended_id=False)
    bus.send(msg)

def vector_recv_msg(bus):
    # 接收CAN消息
    msg = bus.recv(timeout=0.1)
    if msg is not None:
        # 解析CAN消息
        msg_id, dlc, data = prase_can_msg(msg)
        if msg_id is None:
            # print("Error frame received.")
            return False, None, None, None
        
        return True, msg_id, dlc, data
    else:
        return False, None, None, None

def vector_close(bus):
    # 关闭CAN总线
    bus.shutdown()

if __name__ == '__main__':

    bus = vector_init()
    if bus is None:
        print("CAN bus initialized failed.")
        exit(1)

    print("CAN bus initialized successfully.")

    msg_id = 0x7F1
    dlc = 8
    message = [0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
    vector_send_msg(bus, msg_id, message, dlc)

    have_msg, msg_id, dlc, data = vector_recv_msg(bus)
    if have_msg:
        print("Received message:")
        print(f"ID: 0x{msg_id:04X}")
        print(f"DL: {dlc}")
        print("Data: {data}".format(data=' '.join('0x%02x' % i for i in data)))

    vector_close(bus)

创建bus总线对象时需要注意下面这个点,
在这里插入图片描述

5 效果演示

Vector VN1630A插入电脑,另一端连接ECU,然后运行python脚本。

app_cfg: (<XL_HardwareType.XL_HWTYPE_VN1630: 57>, 0, 0)
bus type: <class 'can.interfaces.vector.canlib.VectorBus'>
CAN bus initialized successfully.
Timestamp          channel   msg_id   dlc                   data
1735904698.304546     0       7F2      8     0x1f 0x01 0x02 0x00 0x00 0x00 0x00 0x00
Received message:
ID: 0x07F2
DL: 8
Data: 0x1f 0x01 0x02 0x00 0x00 0x00 0x00 0x00

参考资料:https://python-can.readthedocs.io/en/stable/interfaces/vector.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

职场常用Excel基础04-二维表转换

大家好&#xff0c;今天和大家一起分享一下excel的二维表转换相关内容~ 在Excel中&#xff0c;二维表&#xff08;也称为矩阵或表格&#xff09;是一种组织数据的方式&#xff0c;其中数据按照行和列的格式进行排列。然而&#xff0c;在实际的数据分析过程中&#xff0c;我们常…

编程利器豆包MarsCode它来了

你在使用vsCode进行编写代码时是否遇到代码错误不知道如何修改&#xff1f;是否遇到代码复杂不知道逻辑业务&#xff1f;是否遇到只有思路不知道如何写出代码的情况&#xff1f; 现在&#xff0c;一款代码助手神器它来了&#xff0c;有了它&#xff0c;上面的问题和烦恼统统秒…

idea( 2022.3.2)打包报错总结

一 报错 class lombok.javac.apt.LombokProcessor (in unnamed module 0x4fe64d23) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing …

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机硬件与操作系统之间的桥梁&#xff0c;它负责初始化和测试系统硬件组件&#xff0c;并加载启动操作系统。在某些情况下&#xff0c;如调整启动顺序、更改系统时间或日期、修改硬件配置等&#xff0c;您可能需要进入BIOS进…

小程序组件 —— 25 组件案例 - 商品导航区域

这一节主要实现商品导航区的结构和样式&#xff0c;商品导航区没有新的知识点&#xff0c;主要使用之前学习的三个组件&#xff1a; view&#xff1a;视图容器iamge&#xff1a;图片组件text&#xff1a;文本组件 商品导航区由五个商品导航来组成&#xff0c;每一个视频导航都…

数据结构(ing)

学习内容 指针 指针的定义&#xff1a; 指针是一种变量&#xff0c;它的值为另一个变量的地址&#xff0c;即内存地址。 指针在内存中也是要占据位置的。 指针类型&#xff1a; 指针的值用来存储内存地址&#xff0c;指针的类型表示该地址所指向的数据类型并告诉编译器如何解…

Vue 中el-table-column 进行循环,页面没渲染成功

文章目录 前言效果图代码示例可能出现的问题及原因解决思路 前言 实现效果&#xff1a;el-table-column 进行循环&#xff0c;使之代码简化 遇到的问题&#xff1a; data进行默认赋值&#xff0c;操作列的删除都可以出来&#xff0c;其他表格里面的数据没出来 效果图 示例&am…

OpenGL入门最后一章观察矩阵(照相机)

前面的一篇文章笔者向大家介绍了模型变化矩阵&#xff0c;投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中&#xff0c;我们看到了即使没有观察矩阵&#xff0c;我们也能对绘制出来的模型有一…

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站&#xff1a;https://www.jetbrains.com/pycharm/。下载社区版&#xff08;免费&#xff09;或专业版&#xff08;收费&#xff0c;提供更多功能&#xff09;。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm&#xff0c;并根…

springcloud篇3-docker需熟练掌握的知识点

docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充&#xff1a;配置镜像源 注意&#xff1a; yum安装是在线联网下载安装&#xff0c;而很多的资源…

ceph文件系统

ceph文件系统&#xff1a;高度可扩展&#xff0c;分布式的存储文件系统&#xff0c;旨在提高性能&#xff0c;高可靠性和高可用的对 象存储&#xff0c;块存储&#xff0c;文件系统的存储。使用分布式的算法保证数据的高可用和一致性。 ceph的组件 1、MON&#xff1a;ceph m…

牛客网刷题 ——C语言初阶——BC117 小乐乐走台阶

1.题目 &#xff1a;BC117 小乐乐走台阶 牛客OJ题链接 描述 小乐乐上课需要走n阶台阶&#xff0c;因为他腿比较长&#xff0c;所以每次可以选择走一阶或者走两阶&#xff0c;那么他一共有多少种走法&#xff1f; 输入描述&#xff1a; 输入包含一个整数n (1 ≤ n ≤ 30) …

flux文生图 生成高质量图像

flux文生图 生成高质量图像 flyfish import torch from diffusers import FluxPipeline# 初始化 FluxPipeline model_path "/home/FLUX___1-dev" pipe FluxPipeline.from_pretrained(model_path, torch_dtypetorch.bfloat16) pipe.enable_model_cpu_offload() #…

设计模式 结构型 装饰器模式(Decorator Pattern)与 常见技术框架应用 解析

装饰器模式&#xff08;Decorator Pattern&#xff09;&#xff0c;又称为包装器模式&#xff08;Wrapper Pattern&#xff09;&#xff0c;是一种结构型设计模式。它允许在不改变原有对象结构的基础上&#xff0c;动态地给对象添加一些新的职责&#xff08;即增加其额外功能&a…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫

2021年12月21日 姓名 专业 软件工程 班级 20-IBM-企Java2 题目 基于hadoopSpark的游戏推荐与可视化系统的设计与实现 指导教师 王文钧、王春娴 一、与本题目有关的国内外研究情况、题目研究的目的和意义、主要内容、本课题创新之处、拟解决的问题&#xff1a; 国内外…

[创业之路-222]:波士顿矩阵与GE矩阵在业务组合选中作用、优缺点比较

目录 一、波士顿矩阵 1、基本原理 2、各象限产品的定义及战略对策 3、应用 4、优点与局限性 二、技术成熟度模型与产品生命周期模型的配对 1、技术成熟度模型 2、产品生命周期模型 3、技术成熟度模型与产品生命周期模型的配对 三、产品生命周期与产品类型的对应关系 …

使用Python类库pandas操作Excel表格

Date: 2025.01.02 20:33:30 author: lijianzhan 简述&#xff1a;pandas 是处理 Excel 文件的强大工具&#xff0c;它提供了简单易用的接口来读取、操作和写入 Excel 数据。以下是使用 pandas 处理 Excel 文件的详细指南&#xff0c;包括常见操作和示例代码。 安装依赖,pandas …

Deepseek v3 的笔记

基本概述 Deepseek v3是Deepseek发布的旗舰模型&#xff0c;属于607B的混合专家&#xff08;MoE&#xff09;模型&#xff0c;其中活跃参数为37B。在当前的模型领域&#xff0c;它堪称最佳的开源模型&#xff0c;性能超越了Llama 3.1 405b、Qwen和Mistral等知名模型。根据基准…

Python多分类Logistic回归详解与实践

在机器学习中&#xff0c;Logistic回归是一种基本但非常有效的分类算法。它不仅可以用于二分类问题&#xff0c;还可以扩展应用于多分类问题。本文将详细介绍如何使用Python实现一个多分类的Logistic回归模型&#xff0c;并给出详细的代码示例。 一、Logistic回归简介 Logist…

前端,npm install安装依赖卡在sill idealTree buildDeps(设置淘宝依赖)

输入npm i后&#xff0c;一直卡在sill idealTree buildDeps&#xff0c;一动不动 cnpm可以安装成功&#xff0c;但使用cnpm不会生成package-lock.json文件 设置淘宝依赖&#xff0c;依然卡住&#xff0c;挂梯子也不行 解决方法&#xff1a; // 取消ssl验证 set strict-ssl …