python调用32位的ControlCan.dll实现can报文的收发

Python调用周立功CAN设备:从DLL封装到简易上位机实战 本文详细介绍了如何使用Python调用周立功CAN设备,从DLL封装到简易上位机开发的完整流程。通过Python的ctypes库封装ControlCAN.dll,结合PyQt5构建GUI界面,实现高效的CAN总线通信工具开发。文章还涵盖了硬件连接、环境配置、性能优化及常见问题排查,为嵌入式开发和汽车电子工程师提供实用指南。 阅读详情

python调用ControlCan.dll实现can报文的收发。

1. ControlCan.dll资源获取

实现can通信报文的收发操作,不仅要借助ControlCan.dll,还需要kerneldlls这个文件夹下面的配置文件。一般需要将ControlCan.dll和kerneldlls这个文件夹放置到python调用ControlCan.dll代码程序.py文件的同级目录下。

在这里插入图片描述

欢迎免积分免费下载,32位ControlCan.dll和kerneldlls这个文件夹的获取链接:

https://download.youkuaiyun.com/download/Logintern09/86727513

除了获取ControlCan.dll,还需要获取ControlCan.dll的接口函数使用手册,这样才能够清楚的知道ControlCan.dll封装好能够外部调用的函数有哪些。

在这里插入图片描述

2. 32位环境配置

本人实操发现win10环境 64位的python也无法调用64位的ControlCan.dll,需要采用32位的python环境调用32位的ControlCan.dll。如果电脑上已经安装的是64位的python,需要借助miniconda配置一个32位的环境提供32位的ControlCan.dll运行。

miniconda配置一个32位的python环境参考以下链接:

1.anaconda3下64位python和32位python共存
https://blog.youkuaiyun.com/weixin_41710606/article/details/86747877

2.miniconda安装与使用
https://zhuanlan.zhihu.com/p/102564715?from_voters_page=true

3.64位Anaconda,64位python如何使用pycharm调用32位C#dll文件
https://blog.youkuaiyun.com/weixin_42071767/article/details/101065297

切换成32位的开发环境的指令: set CONDA_FORCE_32BIT=1

32位环境下安装python包:
(1)尝试触发刚创建的这个环境,输入: activate + 环境名
(2)conda install wxpython(安装包名称)

3. python调用ControlCan.dll内部函数的准备工作

参考文章:
1.实践出真知——Python周立功CAN接口收发
https://zhuanlan.zhihu.com/p/195116941

2.使用python来调用CAN通讯的DLL实现方法
https://www.jb51.net/article/164497.htm

python语言调用C#语言封装好的动态链接库.dll文件,一般需要将.dll文件放置在.py文件的同级目录下,python采用ctypes模块,按照dll使用的调用约定来加载.dll动态链接库。

3.1 了解python调用controlcan.dll的方式

在这里插入图片描述

3.2 了解python中ctypes数据类型

C#中的结构体如何转换:
python高级ctypes数据类型—结构体
https://blog.youkuaiyun.com/qq_33287871/article/details/100127524

python中ctypes和C语言中数据类型的对照表:

在这里插入图片描述

4. 结合周立功官网的demo开始造代码

4.1 device类型

参考官网给的C# 的demo,获取controlcan.dll支持的device类型

在这里插入图片描述

代码实现:

device_dict = {
        "VCI_PCI5121": 1,
        "VCI_PCI9810": 2,
        "VCI_USBCAN1": 3,
        "VCI_USBCAN2": 4,
        "VCI_USBCAN2A": 4,
        "VCI_PCI9820": 5,
        "VCI_CAN232": 6,
        "VCI_PCI5110": 7,
        "VCI_CANLITE": 8,
        "VCI_ISA9620": 9,
        "VCI_ISA5420": 10,
        "VCI_PC104CAN": 11,
        "VCI_CANETUDP": 12,
        "VCI_CANETE": 12,
        "VCI_DNP9810": 13,
        "VCI_PCI9840": 14,
        "VCI_PC104CAN2": 15,
        "VCI_PCI9820I": 16,
        "VCI_CANETTCP": 17,
        "VCI_PEC9920": 18,
        "VCI_PCI5010U": 19,
        "VCI_USBCAN_E_U": 20,
        "VCI_USBCAN_2E_U": 21,
        "VCI_PCI5020U": 22,
        "VCI_EG20T_CAN": 23,
        "VCI_PCIE9221": 24,
        "VCI_CANDTU200": 32
}

4.2 初始化can参数

在这里插入图片描述

波特率设置:

在这里插入图片描述

在这里插入图片描述

Timing0和Timing1用来设置CAN波特率:

Timing0_dict = {
        "10Kbps": 0x31,
        "20Kbps": 0x18,
        "40Kbps": 0x87,
        "50Kbps": 0x09,
        "80Kbps": 0x83,
        "100Kbps": 0x04,
        "125Kbps": 0x03,
        "200Kbps": 0x81,
        "250Kbps": 0x01,
        "400Kbps": 0x80,
        "500Kbps": 0x00,
        "666Kbps": 0x80,
        "800Kbps": 0x00,
        "1000Kbps": 0x00,
        "33.33Kbps": 0x09,
        "66.66Kbps": 0x04,
        "83.33Kbps": 0x03
}

Timing1_dict = {
        "10Kbps": 0x1C,
        "20Kbps": 0x1C,
        "40Kbps": 0xFF,
        "50Kbps": 0x1C,
        "80Kbps": 0xFF,
        "100Kbps": 0x1C,
        "125Kbps": 0x1C,
        "200Kbps": 0xFA,
        "250Kbps": 0x1C,
        "400Kbps": 0xFA,
        "500Kbps": 0x1C,
        "666Kbps": 0xB6,
        "800Kbps": 0x16,
        "1000Kbps": 0x14,
        "33.33Kbps": 0x6F,
        "66.66Kbps": 0x6F,
        "83.33Kbps": 0x6F
}

baud_rate_dict = {
        "1000Kbps": 0x060003,
        "800Kbps": 0x060004,
        "500Kbps": 0x060007,
        "250Kbps": 0x1C0008,
        "125Kbps": 0x1C0011,
        "100Kbps": 0x160023,
        "50Kbps": 0x1C002C,
        "20Kbps": 0x1600B3,
        "10Kbps": 0x1C00E0,
        "5Kbps": 0x1C01C1
}

4.3 按照can通讯的流程重新封装接口函数

在这里插入图片描述

由以上流程图可以看出,实现can报文的收发操作主要涉及的函数如下:

在这里插入图片描述

根据以上报文发送和接收流程,得到初始化can通道的代码实现:

def init_can(baud_rate, DevType, DevIndex, CANIndex=0):
    res_list = []
    Timing0 = Timing0_dict[baud_rate]
    Timing1 = Timing1_dict[baud_rate]
    vci_initconfig = VCI_INIT_CONFIG(0x00000000, 0xFFFFFFFF, 0,
                                     1, Timing0, Timing1, 0)
    try:
        res_list.append(open_device(DevType, DevIndex, 0))
        res_list.append(set_reference(DevType, DevIndex, CANIndex, 0, baud_rate_dict[baud_rate]))
        res_list.append(ini_can(DevType, DevIndex, CANIndex, vci_initconfig))
        res_list.append(start_device(DevType, DevIndex, CANIndex))
        res_list.append(clear_buffer(DevType, DevIndex, CANIndex))
    except:
        pass
    if all(res_list):
        return True
    else:
        return False

can报文发送的代码实现:

def send_msg(msg_id, extern_flag, msg_data, DevType, DevIndex, CANIndex=0):
    # 发送报文
    def data_input(data):
        ubyte_array = (c_ubyte * 8)()
        for i in range(len(data)):
            ubyte_array[i] = data[i]
        return ubyte_array
    # 这里是将字符转成16进制
    datas = data_input([int(x, 16) for x in msg_data.strip(' ').split(' ')])
    radar_data = VCI_CAN_OBJ()
    radar_data.ID = msg_id
    radar_data.SendType = 0
    radar_data.RemoteFlag = 0
    radar_data.ExternFlag = extern_flag
    radar_data.DataLen = 8
    radar_data.Data = datas
    return trans_msg(DevType, DevIndex, CANIndex, pointer(radar_data), 1)

can报文接收的代码实现:

def get_msg():
    # 接收报文
    receive_len = 50
    vci_can_array = _RX_CAN_OBJ * receive_len
    vci_can_obj = vci_can_array(_RX_CAN_OBJ())
    while 1:
        receive_res = receive_msg(DevType, DevIndex, CANIndex, vci_can_obj, receive_len, 0)
        if receive_res > 0:
            for i in range(receive_res):
                analyse_msg(vci_can_obj[i])
        else:
            print("接收缓存区为空")

解析一帧报文数据的代码实现:

def analyse_msg(vci_can_obj):
    # 解析一帧数据
    msg_id = hex(vci_can_obj.ID)
    print("帧ID ", msg_id)
    if vci_can_obj.RemoteFlag == 0:
        print("数据帧 ")
    else:
        print("远程帧 ")
    if vci_can_obj.ExternFlag == 0:
        print("标准帧 ")
    else:
        print("扩展帧 ")
    if vci_can_obj.RemoteFlag == 0:
        print("数据: ")
        print("0", bytearray(vci_can_obj.Data).hex()[0:2])
        print("1", bytearray(vci_can_obj.Data).hex()[2:4])
        print("2", bytearray(vci_can_obj.Data).hex()[4:6])
        print("3", bytearray(vci_can_obj.Data).hex()[6:8])
        print("4", bytearray(vci_can_obj.Data).hex()[8:10])
        print("5", bytearray(vci_can_obj.Data).hex()[10:12])
        print("6", bytearray(vci_can_obj.Data).hex()[12:14])
        print("7", bytearray(vci_can_obj.Data).hex()[14:16])

5. 完整代码

本人调用32位controlcan.dll内部函数实现can报文收发操作的二次封装函数文件命名为can_interface.py。完整程序代码下载请前往csdn资源链接:
python重新封装32位controlcan.dll内部函数可实现can报文收发

往期相关知识回顾

1.解决python使用controlcan.dll接收报文每次只能处理一条报文信息问题
2.上位机实现can报文的周期性发送(python3)
3.wxpython设计GUI:报文发送线程正在运行时,点击右上角的窗口关闭按钮,界面卡死无响应
4.使用ControlCAN.dll收发报文功能实现诊断仪与硬件的UDS报文交互
5.利用全局字典在上位机界面和报文发送线程间传递信息

基于PyQt5与周立功CAN库开发定制化上位机:从环境搭建到多线程通信实战 在嵌入式与汽车电子开发领域,上位机作为连接硬件设备与操作人员的核心软件,其定制化开发需求日益增长。其基本原理在于通过特定的通信协议(如CAN总线)与下位机进行数据交互,实现指令发送、数据监控与解析等功能。从技术价值看,自主开发上位机不仅能满足特定业务场景的灵活需求,还能有效控制成本并实现功能深度定制。在应用场景上,无论是产线测试、车载网络数据分析还是设备监控,一个稳定高效的上位机都是关键工具。本文聚焦于利用PyQt5这一工业级GUI框架构建用户界面,并结合周立功CAN卡的ControlCAN动态链接库(DL 阅读详情

相关推荐

基于PyQt5与周立功CAN库开发定制化CAN总线监控分析工具

CAN总线作为汽车电子与工业控制领域的核心通信协议,其调试与数据分析常需依赖上位机软件。通用工具虽功能齐全,但在自定义解析、多源数据联动等场景下灵活性不足。通过Python生态中的PyQt5 GUI框架,开发者可快速构建跨平台桌面应用,并结合ctypes库调用硬件厂商提供的动态链接库(DLL),实现与物理总线的可靠通信。这种技术组合不仅提升了开发效率,还便于集成Pandas、Matplotlib等数据分析与可视化组件,为实时监控、信号解析与数据回放提供了强大支持。本文聚焦于使用PyQt5封装周立功Contr

weixin_33908217的博客 393

解决VS调用周立功ControlCAN.dll报错:无法加载 DLL“ControlCAN.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

解决VS调用周立功ControlCAN.dll报错:无法加载 DLL“ControlCAN.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 visual studio软件调用ControlCAN.dll,遇到的第一个问题报错如下: 解决办法:将ControlCAN.dll放在C#工程文件bin目录下面的debug目录后解决了问题。 ConsoleApp2是用visual studio软件建立的工程目录 ...

Logintern09的博客 7596

Python调用USBCANFD-200U DLL:ctypes封装与CAN FD总线通信实践

在嵌入式开发与汽车电子领域,控制器局域网(CAN)总线是实现设备间可靠通信的核心技术。其工作原理基于差分信号和仲裁机制,确保了多节点网络中的实时性与鲁棒性。随着技术演进,CAN FD(灵活数据速率)协议在保持兼容性的同时,大幅提升了数据吞吐量,其技术价值在于满足了现代汽车电子和工业自动化对更高带宽的需求,广泛应用于车载网络、工业控制等场景。当需要利用PC进行总线分析或控制时,常借助USBCANFD-200U等硬件,但官方SDK通常仅提供C/C++接口。本文聚焦于使用Python标准库`ctypes`,通过精

weixin_33805743的博客 350

【免费下载】 32位ControlCan.dll:轻松实现CAN报文收发

32位ControlCan.dll:轻松实现CAN报文收发 【下载地址】32位ControlCan.dll下载仓库 32位ControlCan.dll 下载仓库 项目地址: https://gitcode.com/open-sou...

gitblog_09718的博客 1447

Python实现CAN通讯

CAN通讯是一种高可靠性、高效率的通信协议,具有抗干扰能力强、高可靠性、高效率和支持多节点等特点。它在汽车、工业控制、航空航天和医疗设备等领域得到广泛应用,成为实时应用通信的重要技术。Python-can 是一个功能强大的 Python 库,用于控制和通信汽车网络。它提供了一组简单易用的接口和工具,用于发送和接收 CAN 消息,以及解析和处理 CAN 数据。通过它,可以轻松地与 CAN 总线进行通信,并与汽车和工业领域的电子控制单元进行交互。

sinat_35773915的博客 6041

ControlCAN.dll(64位)

配套https://blog.csdn.net/ChaoChao66666/article/details/127361519?spm=1001.2014.3001.5501这篇博客的文件

【亲测免费】 32位ControlCan.dll 下载仓库

32位ControlCan.dll 下载仓库 【下载地址】32位ControlCan.dll下载仓库 32位ControlCan.dll 下载仓库 项目地址: https://gitcode.com/open-source-too...

gitblog_09740的博客 664

使用CANTest软件,3种CAN盒的ControlCAN.dll封装切换

使用CANTest软件,3种CAN盒的ControlCAN.dll封装切换

python调用32位dll_使用python来调用CAN通讯的DLL实现方法

由于工作上的需要,经常要与USBCAN打交道,但厂家一般不会提供PYTHON的例子,于是自己摸索地写一个例子出来,以便在工作上随时可以使用PYTHON来测试CAN的功能。这里的例子是使用珠海创芯科技有限公司的USBCAN接口卡,他们提供一个ControlCAN.dll,也提供了一个.h文件,如下:#ifndef CONTROLCAN_H#define CONTROLCAN_H////文件版本:v2...

weixin_39871649的博客 625

PEAK CAN自动发送CAN报文的python程序.zip

简单的Python程序(基于Python3.7)实现PCAN自动发送CAN报文。。。。 程序定义了每隔10ms、100ms、1000ms各发送若干帧数据。 修改main.py文件中的msg.ID、msg.MSGTYPE、msg.DATA可以修改帧ID、帧类型和数据。

ControlCAN_controlCAN.dll_vci_opendevice_controlcan_周立功CANlabvie

基于dll生成lvlib,可快速搭建程序

python serial 库函数_(二)实践出真知——Python周立功CAN接口收发

周立功can相关资料下载:https://www.zlg.cn/can/down/down/id/22.html首先,把下载的库函数文件(由上面链接下载)都放在工作目录下。库函数文件总共有三个文件:ControlCAN.h、ControlCAN.lib、ControlCAN.dll 和一个文件夹 kerneldlls。但是其实我在使用的过程当中,只用到了ControlCAN.dll,并非需要以上操...

weixin_36255898的博客 1446

ControlCAN.dll

使用硬件 CANalyst-ii

can usb tool下载_(二)实践出真知——Python周立功CAN接口收发

周立功can相关资料下载:https://www.zlg.cn/can/down/down/id/22.html首先,把下载的库函数文件(由上面链接下载)都放在工作目录下。库函数文件总共有三个文件:ControlCAN.h、ControlCAN.lib、ControlCAN.dll 和一个文件夹 kerneldlls。但是其实我在使用的过程当中,只用到了ControlCAN.dll,并非需要以上操...

weixin_39576294的博客 1257

PX4 磁罗盘干扰分析

无人机上的电机电流会干扰无人机上搭载的磁罗盘,PX4官方提供了一些方式,通过分析飞行日志,判断电机是否对磁罗盘有严重影响。

Zecet的博客 3358

大模型-internvl高通qnn运行源码解读

模型链接:https://huggingface.co/OpenGVLab/InternVL2-2B论文官方简要说明 https://internvl.github.io/blog/2024-07-02-InternVL-2.0中文解读 https://zhuanlan.zhihu.com/p/702946079在线demo https://internvl.opengvlab.com/

点滴的岁月 1832

CAN通信实战:从硬件选型到软件实现

本文全面解析CAN通信从硬件选型到软件实现的实战指南,涵盖USB-CAN与以太网转CAN适配器的选型对比、Windows与Linux平台驱动配置详解、多语言编程示例(C#/Python/C++)以及错误处理与调试技巧。通过工业监控系统实战案例,帮助开发者快速掌握CAN总线通信技术,提升项目开发效率与稳定性。

rice5的博客 1000

关于三维全波电磁场仿真软件CST的安装和问题解决

百度网盘链接:https://pan.baidu.com/s/1RgWr8Qau1EzSOlh29SewFQ提取码:fzza这里是2023版本的CST,需要其他版本的uu们可以去官网或者其他人的网盘下载。

weixin_60728441的博客 3616
上一篇: 纪念一下| 上传资源的创作者等级升级到Lv4
下一篇: 【文献研究】班轮联盟下合作博弈的概念
草莓仙生
博客等级 码龄8年 2033粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草莓仙生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值