周立功USBCANFD_200U的Python调用

参考前篇 周立功USBCAN-II的Python调用

在这里插入图片描述

当普通CAN用, 500K, 程序参考如下(未验证, 如需CANFD Fast传输, 把发送函数的BRS参数提出来, 采样点设置暂无)

from zlgcan import *
import time
import platform

zcanlib = ZCAN() 

def open_usbcan2():
    device_handle = zcanlib.OpenDevice(ZCAN_USBCANFD_200U, 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_CANFD
    chn_init_cfg.config.canfd.mode = 0
    # From dev_info.json
    chn_init_cfg.config.canfd.abit_timing = 104286	# 500K
    chn_init_cfg.config.canfd.dbit_timing = 4260362	# 2M
    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_TransmitFD_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.brs     = 0 # 1: fast, for examplt: 2M
		msgs[i].frame.len     = len
        for j in range(len):
            msgs[i].frame.data[j] = data[j]
    ret = zcanlib.TransmitFD(chn_handle, msgs, transmit_num)

def receive_can(chn_handle):
    rcv_num = zcanlib.GetReceiveNum(chn_handle, ZCAN_TYPE_CANFD)
    if rcv_num:
        print("Receive CAN message number:%d" % rcv_num)
        rcv_msg, rcv_num = zcanlib.ReceiveFD(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")

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

  • 0
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要使用立功的接口函数来完成CAN报文的接收,需要先安装好立功提供的驱动程序及API库,并且在Python调用该API库。 以下是一个基本的Python代码示例,演示如何使用立功的接口函数来实现CAN报文的接收: ```python import os from ctypes import * # 加载立功提供的API库 dll_path = os.path.join(os.getcwd(), "ControlCAN.dll") can_lib = cdll.LoadLibrary(dll_path) # 定义数据类型 DWORD = c_ulong HANDLE = c_void_p BYTE = c_ubyte PVCI_CAN_OBJ = POINTER(VCI_CAN_OBJ) # 定义CAN参数结构体 class VCI_INIT_CONFIG(Structure): _fields_ = [("AccCode", DWORD), ("AccMask", DWORD), ("Reserved", DWORD), ("Filter", c_ubyte), ("Timing0", c_ubyte), ("Timing1", c_ubyte), ("Mode", c_ubyte)] # 打开CAN设备 device_type = 4 # USB-CANFD-200U device_index = 0 can_lib.VCI_OpenDevice(device_type, device_index, 0) # 初始化CAN参数 can_config = VCI_INIT_CONFIG() can_config.AccCode = 0x00000000 can_config.AccMask = 0xFFFFFFFF can_config.Filter = 0x01 can_config.Timing0 = 0x01 can_config.Timing1 = 0x1C can_config.Mode = 0x00 can_lib.VCI_InitCAN(device_type, device_index, 0, byref(can_config)) # 启动CAN设备 can_lib.VCI_StartCAN(device_type, device_index, 0) # 循环读取CAN报文 while True: # 读取CAN报文数量 count = can_lib.VCI_GetReceiveNum(device_type, device_index, 0) if count > 0: # 读取CAN报文数据 can_data = (VCI_CAN_OBJ * count)() can_lib.VCI_Receive(device_type, device_index, 0, byref(can_data), count, 0) # 处理CAN报文数据 for i in range(count): can_msg = can_data[i] print("ID: 0x{:08X}, Data: {}".format(can_msg.ID, can_msg.Data)) ``` 在上述代码中,我们首先加载了立功提供的API库,并定义了一些需要使用的数据类型和CAN参数结构体。然后通过调用接口函数来打开、初始化和启动CAN设备。最后,在一个循环中不断读取CAN报文数据,并进行处理。 需要注意的是,由于立功的API库是用C语言编写的,因此在Python调用时需要使用ctypes库来进行包装和转换。此外,还需要根据实际情况修改CAN参数和设备编号等参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值