周立功USBCAN-II的Python调用

2023-05-16

目录

  • USBCAN-II
  • 环境配置
  • CAN收发
  • 运行
  • zcanpro
  • 微信公众号

USBCAN-II

USBCAN-II, 或者叫USBCAN2是周立功(致远电子)比较经典的USB接口的CAN卡, 有两路标准CAN, 最高支持到1M波特率, 单用USB就可以供电通信, 无内部终端电阻:

在这里插入图片描述

上位机ZCANPRO本身功能强大, 基本的收发报文, 总线负载率, 录包回放, 实时曲线, 脚本, UDS等支持的非常完善, 但本篇还是要写一下Python和USBCAN2的联动.

ZLG提供了两种 二次开发函数库与例程:

  • zlgcan, 比较新, 官方推荐, 本篇也用这个
  • ControlCAN, 旧接口

环境配置

如下:

  • Win10, 安装64位 python 3.9.4, 也测试了ZLG官方推荐的Python2.7和3.6版本

  • 下载并安装 USBCAN-II的Windows驱动

  • 使用zlgcan进行二次开发, 依赖 Microsoft Visual C++运行库版本(必须具备): 2005、2008、2010、2012、2013, 所以下载安装 VS运行库: 在这里插入图片描述

  • 下载目前最新的20210108版本的zlgcan_dll.zip, 解压后有zlgcan_x64和zlgcan_x86文件夹, 分别对应64位和32位python, 配置环境或者写程序主要用到文件夹里面的 kerneldlls 文件夹和zlgcan.dll文件: 在这里插入图片描述

  • 下载最新的例程Demo zlgcan_python.zip, 解压后如图, 配置环境用到copy_dll.py, 写程序用到zlgcan.py, 这里面也有kerneldlls文件夹和zlgcan.dll文件, 版本可能太老, 不用它们: 在这里插入图片描述

  • 如果是python 3.8及以上版本, 跳过此步, 否则拷贝copy_dll.py文件到zlgcan_x64文件夹内, 运行python copy_dll.py, 其实就是把最新的kerneldlls文件夹拷贝到python安装根目录下, 手动复制也可以, 2.7和3.6版本都可以拷贝进去, 这样都支持了

CAN收发

开始正式写程序了, 拷贝上面zlgcan_x64文件夹下的 kerneldlls文件夹, zlgcan.dll文件, 还有例程Demo中的 zlgcan.py文件, 到自己的工程目录下, 再新建一个usbcan2.py文件

usbcan2.py写入以下代码:

from zlgcan import *
import time
import platform

zcanlib = ZCAN() 

def open_usbcan2():
    device_handle = zcanlib.OpenDevice(ZCAN_USBCAN2, 0,0)
    if device_handle == INVALID_DEVICE_HANDLE:
        print("Open Device failed!")
        exit(0)
    print("device handle:%d." %(device_handle))
    # info = zcanlib.GetDeviceInf(device_handle)
    # print("Device Information:\n%s" %(info))
    return device_handle

def open_channel(device_handle, channel):
    chn_init_cfg = ZCAN_CHANNEL_INIT_CONFIG()
    chn_init_cfg.can_type = ZCAN_TYPE_CAN
    chn_init_cfg.config.can.acc_mode = 0
    chn_init_cfg.config.can.acc_mask = 0xFFFFFFFF
    # From dev_info.json
    # 250K: (1,28)
    # 500K: (0,28)
    # 1M  : (0,20)
    chn_init_cfg.config.can.timing0 = 0
    chn_init_cfg.config.can.timing1 = 28
    chn_handle = zcanlib.InitCAN(device_handle, channel, chn_init_cfg)
    if chn_handle is None:
        return None
    zcanlib.StartCAN(chn_handle)
    return chn_handle

def transmit_can(chn_handle, stdorext, id, data, len):
    transmit_num = 1
    msgs = (ZCAN_Transmit_Data * transmit_num)()
    for i in range(transmit_num):
        msgs[i].transmit_type = 0 #Send Self
        msgs[i].frame.eff     = 0
        if stdorext:
            msgs[i].frame.eff = 1 #extern frame
        msgs[i].frame.rtr     = 0 #remote frame
        msgs[i].frame.can_id  = id
        msgs[i].frame.can_dlc = len
        for j in range(msgs[i].frame.can_dlc):
            msgs[i].frame.data[j] = data[j]
    ret = zcanlib.Transmit(chn_handle, msgs, transmit_num)
    # print("Tranmit Num: %d." % ret)

def receive_can(chn_handle):
    rcv_num = zcanlib.GetReceiveNum(chn_handle, ZCAN_TYPE_CAN)
    if rcv_num:
        print("Receive CAN message number:%d" % rcv_num)
        rcv_msg, rcv_num = zcanlib.Receive(chn_handle, rcv_num)
        for i in range(rcv_num):
            print("[%d]:ts:%d, id:0x%x, dlc:%d, eff:%d, rtr:%d, data:%s" %(i, rcv_msg[i].timestamp, 
                  rcv_msg[i].frame.can_id, rcv_msg[i].frame.can_dlc, 
                  rcv_msg[i].frame.eff, rcv_msg[i].frame.rtr,
                  ''.join(hex(rcv_msg[i].frame.data[j])[2:] + ' ' for j in range(rcv_msg[i].frame.can_dlc))))

if __name__ == "__main__":

    # dll support
    if platform.python_version()>='3.8.0':
        import os
        os.add_dll_directory(os.getcwd())

    # open device and channel 0
    dev_handle = open_usbcan2()
    chn_handle = open_channel(dev_handle, 0)
    chn1_handle = open_channel(dev_handle, 1)
    print("channel 0 handle:%d." %(chn_handle))
    print("channel 1 handle:%d." %(chn_handle))

    # send can message
    data = [0,1,2,3,4,5,6,0xFF]
    for i in range(2):
        transmit_can(chn_handle, 0, 0x100, data, 6)
        transmit_can(chn1_handle, 0, 0x101, data, 7)
        transmit_can(chn_handle, 1, 0x12345678, data, 8)
        transmit_can(chn1_handle, 1, 0x12345679, data, 8)
        data[0] = data[0] + 1
        time.sleep(0.1)

    # receive can message
    zcanlib.ClearBuffer(chn_handle)
    time.sleep(3)
    receive_can(chn_handle)
    receive_can(chn1_handle)

    #Close Channel
    zcanlib.ResetCAN(chn_handle)
    zcanlib.ResetCAN(chn1_handle)
    #Close Device
    zcanlib.CloseDevice(dev_handle)
    print("Finished")

其中:

  • 参考FileNotFoundError: Could not find module ‘.dll’, 对于python3.8及以后的版本, 因为安全性的原因, 仅搜索包含 DLL 或 PYD 文件的系统路径、目录以及使用add_dll_directory () 添加的目录,以搜索加载时的依赖关系。具体来说,不再使用 PATH 和当前工作目录,对这些目录的修改将不再对正常的 DLL 分辨率产生任何影响。所以需要在一开始判断版本号大于等于3.8, 调用add_dll_directory 添加本地dll目录. 这也是python3.8及之后的版本不需要执行上面copy_dll.py的原因, 直接把kerneldlls文件夹和zlgcan.dll放在当前目录即可

  • open_usbcan2()函数打开设备

  • open_channel()函数打开设备的通道, usbcan2有两个通道0, 1

  • transmit_can(chn_handle, stdorext, id, data, len) 发送can报文到通道, 需指定标准帧(0)/扩展帧(1), id, 数据, 字节数

  • receive_can 默认会返回从打开通道开始缓存的所有CAN报文, 这里通道1是这样的. 如果想接收最新的, 可以先清下缓存再开始接收, 这里通道0这么处理的, 只返回time.sleep(3)也就是3s内收到的报文

  • 最后先关2个通道, 再把设备关掉

运行

把USBCAN2的两个通道, Xavier的can1都接在一起, Xavier一边接收candump -td -x can1, 一边运行1s发1帧的发送脚本:

#!/bin/sh

while true; do
    cansend can1 123#01.02.03.04.05.06.07.08
    sleep 1
done

运行python usbcan2.py, 在Xavier的can1收到USBCAN2的通道0和1发来的报文:

在这里插入图片描述

usbcan2.py运行日志如下:

在这里插入图片描述

注意:

  • 使用python2.7, 3.6, 3.9版本都没有问题, python3版本的安装和切换可以使用 pyenv-win · PyPI, 如安装python 3.6.8: pyenv install 3.6.8, 切换过去pyenv local 3.6.8
  • 通道0先清了缓存, 3s内收到了Xavier can1发来的3帧报文
  • 通道1从打开通道就一直在收, 收到了通道0发送的4帧报文和3s内收到的Xavier can1发出的3帧报文

zcanpro

zcanpro软件菜单栏->高级功能->扩展脚本, 可以运行python文件, 没有尝试, 有兴趣的可以试一把:

在这里插入图片描述

官方的示例程序默认在: C:\Program Files (x86)\ZCANPRO\scripts\demo.py, 这个demo里面的注释详细讲解了zcanpro模块的用法, demo主要有3个小脚本: 展示总线0的数据转发至总线1, UDS诊断服务, 控制设备定时发送.

要运行必须先安装Python3.8.x的32位版本,不支持其他版本,并且将Python安装目录添加至系统环境变量中.

微信公众号

欢迎扫描二维码关注本人微信公众号, 及时获取最新文章:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

周立功USBCAN-II的Python调用 的相关文章

  • APM无人机软件在环仿真环境搭建

    题记 xff1a 最近做毕业设计得用到无人机仿真 xff0c 重操旧业 xff0c 搞一搞SITL仿真 给个传送门参考 xff1a 无人机SITL仿真 APM软件在环仿真 我的环境 xff1a ubuntu18 04虚拟机 1 官方教程 a
  • 无人机导航中的各类坐标系

    无人机中的各类坐标系学习笔记 xff1a 北东地坐标系 NED north east down 东北天 ENU east north up 机体坐标系 body frame 1 导航中的坐标系理解 重要参考 导航中 xff0c 最重要的两个
  • 有了Systick中断为什么还要PendSV中断?

    文章目录 问题 xff1a 原因 xff1a 1 在SysTick中断里完成任务切换会降低操作系统的实时性 xff1a 2 把systick优先级设置为最高把PendSV设置为最低的好处 xff1a 3 结语 xff1a 问题 xff1a
  • OpenCV/caffe安装流程

    公司正在做人脸识别系统 xff0c 用到了OpenCV库 xff0c 下面就是根据网上资料以及自己多次部署安装的经验整理的安装流程 xff0c 希望能给一些人一点参考 系统 xff1a Ubuntu1604 CPU架构 xff1a 一般是x
  • win10远程桌面连接ubuntu18.04

    一开始 xff0c 我是根据这个教程进行操作的 xff0c 改了设置为共享 xff0c 安装xrdp等 xff0c 一切都完成后 xff0c 当进行连接时 xff0c 也会出现那个xrdp连接界面 xff0c 但只要一登陆 xff0c 界面
  • 机器学习算法知识点整理

    1生成模型generative model和判别模型 discriminative model 已知输入变量x xff0c 生成模型通过对观测值和标注数据计算联合概率分布P x y 来达到判定估算y的目的 判别模型通过求解条件概率分布P y
  • 我的2014年总结——奔波的一年

    2014年 xff0c 发生了一些人生的大事 xff0c 这些事既有忧 xff0c 又有喜 这因为有这些事情的发生 xff0c 所以我们才越发成熟 xff0c 越发稳重 2014年技术的提升没有前2年那么突飞猛进了 xff0c 生活的事情也
  • 谈谈你对Spring Bean生命周期的理解【面试】

    前言 面试中经常会被问到Spring Bean的生命周期 xff0c 有些人说记不住 xff0c 看了一遍源码也是云里雾里的 xff0c 那是因为只看理论 xff0c 没有自己实践 xff0c 如果自己亲自写代码验证一下 xff0c 不管是
  • FreeRTOS初级篇----名称规范

    数据类型 TickType t xff1a FreeRTOS中断计数值类型 xff0c 可以是16位也可以是32位 xff0c 对于32位CPU来说TickType t最好为32位 BaseType t xff1a 是能够让CPU运行效率最
  • FreeRTOS初级篇----创建任务--动态创建、静态创建

    任务创建函数 xff1a xTaskCreate BaseType t span class token function xTaskCreate span span class token punctuation span TaskFun
  • Linux 性能测试与分析

    源自 http blog sina com cn s blog 71ad0d3f01019uzl html Linux 性能测试与分析 Revision History Version Date Author Description 1 0
  • HashMap底层原理

    文章目录 1 HashMap的概念2 底层数据结构2 JDK1 8之前存在的问题 xff1f 3 问题 xff1a 加载因子为什么默认值为0 75f xff1f 4 问题 xff1a 如果得到key的hash值 xff08 哈希码 xff0
  • 解决虚拟机能够ping通本机,但是无法上网问题

    查看centos网关是否设置正确 root 64 localhost ethan grep GATEWAY etc sysconfig network scripts ifcfg etc sysconfig network scripts
  • c语言字符串分割函数

    C语言字符串分割 strsep函数用于分解字符串为一组字符串 定义语句为char strsep char stringp const char delim 使用实例 xff1a include lt stdio h gt include l
  • Android Socket学习(三)三方apk执行shell命令

    include lt stdio h gt include lt stdlib h gt include lt string h gt include lt fcntl h gt include lt sys types h gt incl
  • ADB命令用法大全

    一 ADB简介 Android Debug Bridge xff0c 安卓调试桥 xff0c 它借助adb exe xff08 Android SDK安装目录platform tools下 xff09 xff0c 用于电脑端与模拟器或者真实
  • SDN入门_基本概念掌握

    部署SDA的链接 xff1a https www cisco com c en us solutions enterprise networks software defined access compatibility matrix ht
  • docker-io, docker-ce, docker-ee 区别

    docker io docker engin 是以前早期的版本 xff0c 版本号是 1 xff0c 默认centos7 安装的是docker io xff0c 最新版是 1 13 docker ce 是社区版本 xff0c 适用于刚刚开始
  • Typora免费版下载【Mac、Windows】

    前言 Typora1 0版本之后是付费版本 xff0c 1 0之前的版本官方网站已移除 xff0c 在网上找了好久 xff0c 现在记录下来 下载 付费版 Typora支持macOS Window Linux系统 xff1a 官方下载地址
  • docker修改镜像名称以及tag版本

    docker tag 镜像ID 镜像名称 tag版本信息 docker tag 8ef375298394 mysql v5 7

随机推荐

  • npm安装报错解决合集(一)

    在新版nodejs已经集成了npm xff0c 所以npm也都安装好了 可以通过输入下面命令来测试是否成功安装 node v npm v 如果安装成功 xff0c 都会出现版本号 用npm v测试 xff0c 报错 xff1a node i
  • ES6系列——类数组转换为数组的几种方法以及for of、forin、for Each的区别

    以及目录 一 什么是类数组 xff1f 二 什么是类数组对象 xff1f 第一种方法 xff1a 使用for in 将类数组对象转换为数组 第二种方法 内置对象keys和valus 第三种方法 xff1a Array from for of
  • 对.net事件的看法

    一 事件的本质 事件是软件系统里的两个子系统之间 xff0c 或者两个模块之间 xff0c 或者两个对象之间发送消息 xff0c 并处理消息的过程 在面向对象的世界里 xff0c 就可以统一认为是两个对象之间的行为 两个对象之间发送的这种消
  • 深入理解module.exports、exports、require、export、export default、import

    前言 xff1a 说到module exports exports require export export default import这些 xff0c 有一点我们是必须要提一下的 xff0c 就是模块化编程方式 以上这些都是模块之间的
  • 服务器安全设置Centos7 防火墙firewall与iptables

    一 gt gt gt gt gt gt 启用centos7 iptables防火墙Centos7 防火墙firewall设置方法 我们Sinesafe在处理客户服务器Linux Centos7 64位系统里配置防火墙安全设置需要选择2种方案
  • VTK基本概念之坐标系统

    坐标系统 在实际开发中 xff0c 必须理解不同坐标系统之间的关系 计算机图形学里常用的四种坐标系 xff1a Model坐标系 Word坐标系 View坐标系和Display坐标系统 xff0c 转换关系如下图所示 VTK支持多种不同类型
  • STM32学习(蜂鸣器实验)

    蜂鸣器硬件电路连接 蜂鸣器软件设计 库函数 使能输入输出口时钟 调用函数RCC AHB1PeriphClockCmd 初始化输入输出口模式 调用函数GPIO Init 操作输入输出口 xff0c 输出高低电平 beep h ifdef BE
  • Esxi\CentOS7.6虚机\2080ti驱动 Unable to determine the device handle for GPU 0000:0B:00:00: Unknown ERROR

    整体背景 服务器使用Esxi虚拟出CentOS7 6的虚机 xff0c 然后在虚机中给2080ti显卡安装驱动 安装过程 1 配置显卡直通 此部分由运维完成 xff0c 未参与其中 xff0c 可参考攻略 xff1a https blog
  • 从断舍离中整理生活

    前言 公众号有一个多月未更文 xff0c 主要思考了后续更文的方向 xff0c 最终确定了以读书笔记分享为主题 xff0c 和大家一起学习 一起成长 今天开始 xff0c 每周至少更新一篇文章 xff0c 大家有想看的书可以在后台留言 xf
  • Android Studio升级到 3.2.0,部分依赖库报错 android.arch.lifecycle:runtime:1.0.3,解决办法

    Android Studio升级到 3 2 0 xff0c 部分依赖库报错 问题描述 xff1a Cannot find a version of android arch lifecycle runtime that satisfies
  • OpenCV4.7.0、FFmpeg5.1 Nvidia GPU视频硬解码

    1 环境 操作系统 xff1a Ubuntu18 04 GPU xff1a Nvidia GeForce RTX 2080TI 2 安装2080TI驱动 请参考文章 158条消息 NVIDIA GPU 驱动程序安装 洪流之源的博客 CSDN
  • MQ-2烟雾传感器的使用

    一 MQ 2烟雾传感器简介 MQ 2 烟雾传感器采用在清洁空气中电导率较低的二氧化锡 SnO2 xff0c 属于表面离子式N型半导体 当MQ 2烟雾传感器在200到300摄氏度环境时 xff0c 二氧化锡吸附空气中的氧 xff0c 形成氧的
  • HC-SR04超声波测距模块介绍

    超声波简介 超声波是由机械振动产生的 可在不同介质中以不同的速度传播 具有定向性好 能量集中 传输过程中衰减较小 反射能力较强等优点 超声波传感器可广泛应用于非接触式检测方法 它不受光线 被测物颜色等影响 对恶劣的工作环境具有一定的适应能力
  • 液晶12864显示图片

    液晶12864简介 12864是128 64点阵液晶模块的点阵数简称 基本参数 1 低电源电压 xff08 VDD 43 3 0 xff5e 43 5 5V xff09 2 显示分辨率 128 64 点 3 内置汉字字库 xff0c 提供8
  • 液晶12864显示字符

    液晶12864简介 12864是128 64点阵液晶模块的点阵数简称 基本参数 1 低电源电压 xff08 VDD 43 3 0 xff5e 43 5 5V xff09 2 显示分辨率 128 64点 3 内置汉字字库 xff0c 提供81
  • Bash:command:未找到命令

    前言 在Linux系统中 xff0c 经常会遇到这样的问题 xff1a bash xff1a command xff1a 未找到命令 这个真的很烧脑 xff0c 遇到的次数多 xff0c 在网上也查了好多 xff0c 答案五花八门 xff0
  • S32K148----SDK笔记----CAN收发

    文章目录 前言建立工程ProcessorExpert配置发送CAN报文CAN接收中断工程代码微信公众号 前言 S32K148自带3路CAN 官方的SDK给了can pal的例程 本文更基础一点 直接用flexcan组件相关的函数 CANFD
  • TC397开发板KIT_A2G_TC397_5V_TFT简介

    开发板简介 照片资料调试资源供电扩展CAN 用的开发板是KIT A2G TC397 5V TFT 其实更推荐KIT A2G TC397 3V3 TFT 售价 1 670 59 照片 正面 背面 5V的板子和3 3V的板子主要是下面几个器件不
  • AURIX TC397 Flash编程

    目录 Flash编程基础知识Flash Programming微信公众号 Flash编程基础知识 参考 Flash Programming 1 for KIT AURIX TC397 TFT 本例展示了如何烧写PFLASH Program
  • 周立功USBCAN-II的Python调用

    目录 USBCAN II环境配置CAN收发运行zcanpro微信公众号 USBCAN II USBCAN II 或者叫USBCAN2是周立功 致远电子 比较经典的USB接口的CAN卡 有两路标准CAN 最高支持到1M波特率 单用USB就可以