当前位置: 首页 > news >正文

Python 驱动周立功200U收发报文

文章目录

  • 一、周立功官网下载函数库和例程
  • 二、周立功设备及通道的打开和关闭
  • 三、获取设备信息
  • 四、通道配置
  • 五、获取接收的报文数据
  • # 六、报文发送
  • 提示:加载 zlgcan.dll 时报错 - OSError: [WinError 193] %1 不是有效的 Win32 应用程序
  • 提示:无法打开设备
  • 参考

本文以 USBCANFD200U CAN盒为例

基于python ,使用ZLG USBCANFD200U CAN盒进行收发报文等上位机Demo

一、周立功官网下载函数库和例程

下载链接:https://manual.zlg.cn/web/#/55?page_id=2286

在这里插入图片描述
在这里插入图片描述

二、周立功设备及通道的打开和关闭

在这里插入图片描述

import zlgcan

def main():
    # 创建can实例
    zcanlib = zlgcan.ZCAN()
    # 打开CAN设备
    canDriveHandle = zcanlib.OpenDevice(zlgcan.ZCAN_USBCANFD_200U, 0, 0)
    if canDriveHandle == zlgcan.INVALID_DEVICE_HANDLE:
            print("打开设备失败!")
    else:
            print("打开设备成功!")

    # 初始化
    chn_cfg = zlgcan.ZCAN_CHANNEL_INIT_CONFIG()
    chn0_handle = zcanlib.InitCAN(canDriveHandle, 0, chn_cfg)
    # 启动CAN通道
    zcanlib.StartCAN(chn0_handle)
    # 关闭CAN设备
    zcanlib.CloseDevice(canDriveHandle)

if __name__ == '__main__':
    main()

三、获取设备信息

import zlgcan

def main():
    # 创建can实例
    zcanlib = zlgcan.ZCAN()
    # 打开CAN设备
    canDriveHandle = zcanlib.OpenDevice(zlgcan.ZCAN_USBCANFD_200U, 0, 0)
    if canDriveHandle == zlgcan.INVALID_DEVICE_HANDLE:
            print("打开设备失败!")
    else:
            print("打开设备成功!")

    # 获取设备信息
    deviceInfo = zcanlib.GetDeviceInf(canDriveHandle)
    print("获取 硬件版本号:", deviceInfo.hw_version)
    print("获取 固件版本号:", deviceInfo.fw_version)
    print("获取 驱动程序版本号:", deviceInfo.dr_version)
    print("获取 接口库版本号:", deviceInfo.in_version)
    print("获取 支持通道数量:", deviceInfo.can_num)
    print("获取 板卡的序列号:", deviceInfo.serial)
    print("获取 硬件类型:", deviceInfo.hw_type)
    # 关闭CAN设备
    zcanlib.CloseDevice(canDriveHandle)

if __name__ == '__main__':
    main()

四、通道配置

import zlgcan

def main():
    # 创建can实例
    zcanlib = zlgcan.ZCAN()
    # 打开CAN设备
    canDriveHandle = zcanlib.OpenDevice(zlgcan.ZCAN_USBCANFD_200U, 0, 0)
    if canDriveHandle == zlgcan.INVALID_DEVICE_HANDLE:
            print("打开设备失败!")
    else:
            print("打开设备成功!")

    '''
    仲裁域波特率:
        "50K":12696558,
        "100K":4307950,
        "125K":4304830,
        "250K":110526,
        "500K":104286,
        "800K":101946,
        "1M":101166
    数据域波特率:
        "1M":8487694,
        "2M":4260362,
        "4M":66058,
        "5M":66055
    '''
    # 初始化
    chn0_cfg = zlgcan.ZCAN_CHANNEL_INIT_CONFIG()    
    chn0_cfg.can_type = zlgcan.ZCAN_TYPE_CANFD  # 设置为 CANFD 协议
    chn0_cfg.config.canfd.abit_timing = 104286  # 设置仲裁域波特率 500K
    chn0_cfg.config.canfd.dbit_timing = 4260362 # 设置数据域波特率 2M
    chn0_handle = zcanlib.InitCAN(canDriveHandle, 0, chn0_cfg)
    # 启动CAN通道
    zcanlib.StartCAN(chn0_handle)
    # 关闭CAN设备
    zcanlib.CloseDevice(canDriveHandle)

if __name__ == '__main__':
    main()

五、获取接收的报文数据

import zlgcan
import time

def main():
    # 创建can实例
    zcanlib = zlgcan.ZCAN()
    # 打开CAN设备
    canDriveHandle = zcanlib.OpenDevice(zlgcan.ZCAN_USBCANFD_200U, 0, 0)
    if canDriveHandle == zlgcan.INVALID_DEVICE_HANDLE:
            print("打开设备失败!")
    else:
            print("打开设备成功!")

    '''
    仲裁域波特率:
        "50K":12696558,
        "100K":4307950,
        "125K":4304830,
        "250K":110526,
        "500K":104286,
        "800K":101946,
        "1M":101166
    数据域波特率:
        "1M":8487694,
        "2M":4260362,
        "4M":66058,
        "5M":66055
    '''
    # 初始化
    chn0_cfg = zlgcan.ZCAN_CHANNEL_INIT_CONFIG()    
    chn0_cfg.can_type = zlgcan.ZCAN_TYPE_CANFD  # 设置为 CANFD 协议
    chn0_cfg.config.canfd.abit_timing = 104286  # 设置仲裁域波特率 500K
    chn0_cfg.config.canfd.dbit_timing = 4260362 # 设置数据域波特率 2M
    chn0_handle = zcanlib.InitCAN(canDriveHandle, 0, chn0_cfg)
    # 启动CAN通道
    zcanlib.StartCAN(chn0_handle)
    total_ReceiveNum = 0 # 总共接收到的报文数量
    while(1):
        can_num = zcanlib.GetReceiveNum(chn0_handle, zlgcan.ZCAN_TYPE_CAN) # 获取缓冲区 CAN 报文数量
        canfd_num = zcanlib.GetReceiveNum(chn0_handle, zlgcan.ZCAN_TYPE_CANFD) # # 获取缓冲区 CANFD 报文数量
        if can_num != 0 or canfd_num != 0:
            
            while can_num >= 1:
                read_cnt = 10 if can_num >= 10 else can_num # 若接收缓冲区的报文数量小于10,就以缓冲区内的数量进行读取
                can_msgs, act_num = zcanlib.Receive(chn0_handle, read_cnt, 5) # 5 表示缓冲区无数据,函数阻塞等待时间,单位毫秒
                for i in range(act_num): 
                    #update data
                    total_ReceiveNum += 1
                    rev_Data = " "
                    print("接收到的报文数量:", total_ReceiveNum)
                    print("报文ID:", can_msgs[i].frame.can_id)
                    print("数据长度:", can_msgs[i].frame.can_dlc)
                    for j in range(can_msgs[i].frame.can_dlc): 
                         rev_Data = rev_Data + str(can_msgs[i].frame.data[j]) + " "
                    print("数据:", rev_Data)
                else:
                    break
                can_num -= act_num
            while canfd_num >= 1:
                read_cnt = 10 if canfd_num >= 10 else canfd_num # 若接收缓冲区的报文数量小于10,就以缓冲区内的数量进行读取
                canfd_msgs, act_num = zcanlib.ReceiveFD(chn0_handle, read_cnt, 5) # 5 表示缓冲区无数据,函数阻塞等待时间,单位毫秒
                for i in range(act_num): 
                    #update data
                    total_ReceiveNum += 1
                    rev_Data = " "
                    print("接收到的报文数量:", total_ReceiveNum)
                    print("报文ID:", canfd_msgs[i].frame.can_id)
                    print("数据长度:", canfd_msgs[i].frame.len)
                    for j in range(canfd_msgs[i].frame.len): 
                         rev_Data = rev_Data + str(canfd_msgs[i].frame.data[j]) + " "
                    print("数据:", rev_Data)
                else:
                    break
                canfd_num -= act_num
        else:
            # print("can_num = ", can_num, "canfd_num = ", canfd_num)
            time.sleep(0.002) #wait 2ms

    # 关闭CAN设备
    zcanlib.CloseDevice(canDriveHandle)

if __name__ == '__main__':
    main()

# 六、报文发送

import zlgcan
import time

def main():
    # 创建can实例
    zcanlib = zlgcan.ZCAN()
    # 打开CAN设备
    canDriveHandle = zcanlib.OpenDevice(zlgcan.ZCAN_USBCANFD_200U, 0, 0)
    if canDriveHandle == zlgcan.INVALID_DEVICE_HANDLE:
            print("打开设备失败!")
    else:
            print("打开设备成功!")

    '''
    仲裁域波特率:
        "50K":12696558,
        "100K":4307950,
        "125K":4304830,
        "250K":110526,
        "500K":104286,
        "800K":101946,
        "1M":101166
    数据域波特率:
        "1M":8487694,
        "2M":4260362,
        "4M":66058,
        "5M":66055
    '''
    # 初始化
    chn0_cfg = zlgcan.ZCAN_CHANNEL_INIT_CONFIG()    
    chn0_cfg.can_type = zlgcan.ZCAN_TYPE_CANFD  # 设置为 CANFD 协议
    chn0_cfg.config.canfd.abit_timing = 104286  # 设置仲裁域波特率 500K
    chn0_cfg.config.canfd.dbit_timing = 4260362 # 设置数据域波特率 2M
    chn0_handle = zcanlib.InitCAN(canDriveHandle, 0, chn0_cfg)
    # 启动CAN通道
    zcanlib.StartCAN(chn0_handle)
    total_ReceiveNum = 0 # 总共接收到的报文数量
    while(1):
        send_data = [1,2,3,4,5,6,7,8,9,10,11,12]
        # 发送 CAN 报文
        msg_Can = zlgcan.ZCAN_Transmit_Data()
        msg_Can.transmit_type =  1 # 发送方式, 0=正常发送, 1=单次发送, 2=自发自收, 3=单次自发自收。
        msg_Can.frame.can_id = 25
        msg_Can.frame.can_dlc = 8
        for i in range(msg_Can.frame.can_dlc):
            msg_Can.frame.data[i] = send_data[i]
        zcanlib.Transmit(chn0_handle, msg_Can, 1) # 1 表示报文数目
        time.sleep(0.5) #wait 500ms

        # 发送 CANFD 报文
        msg_Canfd = zlgcan.ZCAN_TransmitFD_Data()
        msg_Canfd.frame.can_id = 45
        msg_Canfd.frame.len = 12
        for i in range(msg_Canfd.frame.len):
            msg_Canfd.frame.data[i] = send_data[i]
        zcanlib.TransmitFD(chn0_handle, msg_Canfd, 1) # 1 表示报文数目
        time.sleep(0.5) #wait 500ms

    # 关闭CAN设备
    zcanlib.CloseDevice(canDriveHandle)

if __name__ == '__main__':
    main()

提示:加载 zlgcan.dll 时报错 - OSError: [WinError 193] %1 不是有效的 Win32 应用程序

这通常是由于 Python 解释器的位数(32 位或 64 位)与 DLL 文件的位数不兼容导致的。
可以通过以下 Python 代码来确认 Python 解释器的位数:

import struct
print(struct.calcsize("P") * 8)

运行上述代码后,如果输出结果是 32,则表示你使用的是 32 位的 Python 解释器;如果输出结果是 64,则表示使用的是 64 位的 Python 解释器。

提示:无法打开设备

从下载的 demo 中,找到 kerneldlls 文件夹,将其放到 zlgcan.py 同一路径下
在这里插入图片描述

  • 返回 Python 专栏目录索引

参考

  • Python+周立功can卡+can收发
http://www.dtcms.com/a/108472.html

相关文章:

  • 国产系统服务器识别不到SATA盘
  • STM32学习笔记之RCC模块(实操篇)
  • 横扫SQL面试——中位数问题
  • git tag
  • Linux 中CIFS和NFS使用说明
  • MCP学习总结
  • 基于RapidIO接口的DSP+GPU工业AI实时计算解决方案
  • ‘conda‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  • 【YOLOv8】YOLOv8改进系列(12)----替换主干网络之StarNet
  • 系统安全——文件监控-FileMonitor
  • 数据在内存中存储(C语言)
  • 杂篇-行业分类一二-2(通、专用设备制造,汽车制造)
  • (done) MIT6.824 Lecture 02 - RPC and Threads
  • stm32:sg90 和 mg90s舵机学习
  • Python----计算机视觉处理(Opencv:道路检测之提取车道线)
  • 好玩有趣的github开源项目分享(持续更新)
  • 【MySQL基础】 JSON函数入门
  • 代码随想录-动态规划18
  • 如何学习C++以及C++的宏观认知
  • AI:机器学习模型-线性回归
  • 清华大学:网络大模型NetGPT研究进展(2025)
  • 深入解析JavaScript混淆加密与Python逆向调用实战-题八
  • 蓝桥杯-算法基础-For循环
  • [CISSP] [5] 保护资产安全
  • Mybatis 如何自定义缓存?
  • UML 关系探秘:理论与实践双维度剖析
  • Cesium for Unreal 源码编译
  • php开发rest api,哪个框架最好
  • C# 窗体应用(.FET Framework) 与 visionpro 连接
  • Unity Final IK:下一代角色动画与物理交互的技术解析