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 VectorBusdef 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, Noneexcept Exception as e:# print("Error frame not found:", e)pass# 提取Timestamptimestamp = float(parts[1])# 提取IDmsg_id = int(parts[3].strip(), 16)# 提取DLC(数据长度)dlc_index = parts.index('DL:') + 1dlc = int(parts[dlc_index].strip())# 提取数据字段data_index = parts.index('DL:') + 2data1 = parts[data_index:data_index+dlc]data = [int(x, 16) for x in data1]# 提取Channelchannel_index = parts.index('Channel:') + 1channel = 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, datadef detect_device_exist():# 检测Vector 1603A设备是否存在device_exist = Falsetry:configs = can.detect_available_configs(interfaces=['vector'])for config in configs:if config['vector_channel_config'].name == 'VN1630A Channel 1':device_exist = Truebreakexcept Exception as e:print("Detect available configs Error:", e)app_exits = Falsetry:app_cfg = VectorBus.get_application_config(app_name='FctTool', app_channel=0)if app_cfg is not None:app_exits = Trueprint("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设备,则返回Falsereturn Falsedef 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 busexcept UnboundLocalError as e:print("Return CAN bus object Error:", e)print("Error: CAN bus channel is used by other application.")return Noneelse: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, Nonereturn True, msg_id, dlc, dataelse:return False, None, None, Nonedef 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 = 0x7F1dlc = 8message = [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
相关文章:

Python脚本实现通过Vector VN1630A CAN盒子与ECU通信
1 安装 python-can 包 安装命令如下: pip install python-can安装完成后可用下面命令查看是否安装成功及版本。 pip show python-canName: python-can Version: 4.4.2 Summary: Controller Area Network interface module for Python Home-page: https://github.…...

Spring实现Logback日志模板设置动态参数
版权说明: 本文由博主keep丶原创,转载请保留此块内容在文首。 原文地址: https://blog.csdn.net/qq_38688267/article/details/144842327 文章目录 背景设计日志格式实现配置动态取值logback-spring.xml 相关博客 背景 多个单体服务间存在少量…...

内部类 --- (寄生的哲学)
内部类总共有 4 种(静态内部类、非静态内部类、局部内部类、匿名内部类) 作用: 一:内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。 二:内部类可以…...

Python深度学习GRU、LSTM 、BiLSTM-CNN神经网络空气质量指数AQI时间序列预测及机器学习分析|数据分享...
全文链接:https://tecdat.cn/?p38742 分析师:Zhixiong Weng 人们每时每刻都离不开氧,并通过吸入空气而获得氧。一个成年人每天需要吸入空气达6500升以获得足够的氧气,因此,被污染了的空气对人体健康有直接的影响&…...

JSP基础
一、Tomcat 1.Tomcat简介: Tomcat是一个免费的开源JSP容器,是Apache的Jakarta项目中的一个核心项目因免费、稳定而成为目前比较流行的Web应用服务器网址:https://tomcat.apache.org/ 2.Tomcat的配置——环境变量 (1)…...

基于Springboot +Vue 在线考试管理系统
基于Springboot Vue 在线考试管理系统 前言 随着信息技术的飞速发展,教育领域正经历着深刻的变革。传统的考试模式因其诸多限制和不便,已难以满足现代教育的需求。基于SpringBoot和Vue框架开发的在线考试系统应运而生,它充分利用了现代互联…...

Node.js 函数
Node.js 函数 1. 概述 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它允许开发者使用 JavaScript 编写服务器端和网络应用程序。在 Node.js 中,函数是一等公民,意味着它们可以作为变量传递,可以作为参数传递给其他函数,也可以从其他函数返回。本文将详细…...

JVM学习指南(9)-JVM运行时数据区
JVM学习指南(9)-JVM运行时数据区 引言 Java虚拟机(JVM)是Java程序运行的核心,它为Java程序提供了一个与平台无关的执行环境。JVM的重要性不仅在于它实现了Java的跨平台特性,还在于它对程序执行过程中内存的管理。JVM运行时数据区是程序执行过程中存储数据的关键区域,理解…...

2025/1/4期末复习 密码学 按老师指点大纲复习
我们都要坚信,道路越是曲折,前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…...

关于嵌入式系统的知识课堂(二)
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于嵌入式系统的知识课堂(…...

基于ETAS工具的AutoConnect实现方案
文章目录 前言基于ISOLAR工具实现AutoConnect基于脚本实现AutoConnect总结前言 Autosar软件架构设计中,Connect通常来自于Composition之间(Assembly connectors),Component之间(Assembly connectors),Component与Composition之间(Delegation connectors),还有一种Pa…...

BGP基础配置实验
一、实验拓补 二、实验要求及分析 实验要求: 1,R1为AS 100区域;R2、R3、R4为AS 200区域且属于OSPF协议;R5为AS 300区域; 2,每个设备上都有环回,且通过环回可以使设备互通; 实验分…...

基于单片机的人体健康指标采集系统设计
1.系统的功能及方案设计 根据系统设计要求,人体健康指标采集系统的系统结构框图如图2.1所示。系统以单片机作为主控核心,协调控制各个模块进行工作。在传感器检测模块中包括MAX30102心率血氧检测模块、体温检测模块、液晶显示模块。系统以无创的形式实现…...

Go语言性能优化-字符串格式化优化
在 Go 语言中,格式化字符串(例如使用 fmt.Sprintf、fmt.Printf 等函数)确实可能对性能产生影响,尤其是当频繁执行格式化操作时。格式化字符串涉及对格式符的解析和数据类型的转换,这会增加额外的开销。为了减少格式化字符串带来的性能影响,可以采取以下一些优化策略: 1…...

UE5失真材质
渐变材质函数:RadialGradientExponential(指数径向渐变) 函数使用 UV 通道 0 来产生径向渐变,同时允许用户调整半径和中心点偏移。 用于控制渐变所在的位置及其涵盖 0-1 空间的程度。 基于 0-1 的渐变中心位置偏移。 源自中心的径…...

SAP 01-初识AMDP(ABAP-Managed Database Procedure)
1. 什么是AMDP(ABAP-Managed Database Procedure) 1.)AMDP - ABAP管理数据库程序,是一种程序,我们可以使用SQLSCRIPT在AMDP内部编写代码,SQLSCRIPT是一种与SQL脚本相同的数据库语言,这种语言易于理解和编码。 将AM…...

关于视频审核,内容风控在“控”什么?
随着互联网用户每周上网时长的增加,内容偏好逐渐向视频形式转移,视频内容成为了企业竞争的新战场。然而,视频内容审核和风险控制成为了企业面临的重大挑战。那么在视频审核中,内容风控到底在“控”什么呢? 视频内容风…...

5G NTN(七) 高层(1)
说明:本专题主要基于3GPP协议38.821 目录 1. Idle态移动性增强 1.1 TA问题 1.1.1 TA的大小 1.1.2 针对NTN LEO的移动TA,场景C2和D2 1.1.3 针对NTN LEO的固定TA,场景C2和D2 1.1.3.1 方法1:当UE位置信息无法获取的时候 1.1.…...

专家混合(MoE)大语言模型:免费的嵌入模型新宠
专家混合(MoE)大语言模型:免费的嵌入模型新宠 今天,我们深入探讨一种备受瞩目的架构——专家混合(Mixture-of-Experts,MoE)大语言模型,它在嵌入模型领域展现出了独特的魅力。 一、M…...

《柴油遗产-无耻时代》V98375官方版
靠近你所在赛道上的另一名玩家进行攻击或防守,跳到另一条赛道上进行恢复,或闪到对手背后打他个措手不及。与队友合作,充分利用每个角色的独特玩法来控制战斗走向! 《柴油遗产-无耻时代》官方版 https://pan.xunlei.com/s/VODW7xDX…...

科技云报到:洞见2025年科技潮流,技术大融合开启“智算时代”
科技云报到原创。 随着2024年逐渐接近尾声,人们不禁开始展望即将到来的2025年。这一年,被众多科技界人士视为开启新纪元的关键节点。站在新的起点上,我们将亲眼目睹未来科技如何改变我们的世界。从人工智能到量子计算,从基因编辑…...

【openwrt】OpenWrt 路由器的 802.1X 动态 VLAN
参考链接 [OpenWrt Wiki] Wi-Fi /etc/config/wirelesshttps://openwrt.org/docs/guide-user/network/wifi/basic#wpa_enterprise_access_point 介绍 基于802.1X 无线网络身份验证...

[coredump] 生成管理
在 Linux 系统中,core dump 文件的生成路径和文件名可以通过几个方面来控制: 系统默认路径: 默认情况下,core dump 文件通常生成在程序的工作目录,即程序运行时的当前目录。文件名通常为 core,或者在某些系…...

CSS——5. 外部样式
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>方法3:外部样式</title><link rel"stylesheet" href"a.css" /><link rel"stylesheet" href"b.css"/&g…...

检查字符是否相同
给你一个字符串 s ,如果 s 是一个 好 字符串,请你返回 true ,否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 ,那么我们称字符串 s 是 好 字符串。 输入:s "abacbc" 输出:t…...

casaos安装最新版homeassistant-arm
进入cosOS界面点自定义安装 Docker镜像:homeassistant/armv7-homeassistant Tag:2024.12.2 标题:Home Assistant 图片路径:https://cdn.jsdelivr.net/gh/IceWhaleTech/CasaOS-AppStoremain/Apps/HomeAssistant/icon.png Web UI:http&…...

openwrt host方式编译ffmpeg尝试及问题分析
openwrt host方式编译ffmpeg尝试及问题分析 configure错误分析编译错误一: ERROR: gnutls not found using pkg-config编译错误2: ERROR: libdrm not found using pkg-config编译错误3: ERROR: libmp3lame >= 3.98.3 not found编译错误4: ERROR: x264 not found using pkg…...

【three.js】搭建环境
一、安装Node.js和npm 下载与安装: 访问Node.js官方网站(nodejs.org),根据你的操作系统下载并安装最新稳定版(LTS版本)的Node.js。安装过程中,npm(Node包管理器)会随No…...

SQLite AND/OR 运算符
SQLite AND/OR 运算符 SQLite 的 AND 和 OR 运算符用于基于一个以上的条件来过滤记录。这些运算符在 WHERE 子句中与 SELECT、UPDATE 和 DELETE 语句一起使用。理解这些运算符的工作方式对于有效地查询数据库至关重要。 AND 运算符 AND 运算符允许我们在 WHERE 子句中指定多…...

《普通逻辑》学习记录——命题的判定与自然推理
目录 一、真值 1.1、真值联结词 1.2、真值联结词与逻辑联结词的区别 1.3、真值形式 1.3.1、真值符号的优先级和结合性规则 1.4、真值规则 1.4.1、条件式(蕴含式) P → Q 的真值规则 1.4.2、双条件式(等值式) P ↔ Q 的真值规则 1.…...