Python调用周立功CAN接口卡接口库函数(接收数据)

9 篇文章 6 订阅

上篇博文《Python调用周立功CAN接口卡接口库函数》仅做了发送数据例程,有网友在测试接收时出现了问题,在此给出自己的接收数据代码。
在此需要强调的是,因为经济水平有限,自己所使用的CAN接口卡为第三方兼容周立功函数库的接口卡,经测试,第三方CAN接口卡VCI_Receive接收函数其参数WaitTime是无效的,即使该值为-1,也不会阻塞等待数据,若使用周立功原版接口卡则无此问题。
以USBCAN-2E-U接口卡,1000k波特率,接收一帧数据并打印为例,代码如下:

import platform
import time
from ctypes import *


class _VCI_INIT_CONFIG(Structure):
    _fields_ = [('AccCode', c_ulong),
                ('AccMask', c_ulong),
                ('Reserved', c_ulong),
                ('Filter', c_ubyte),
                ('Timing0', c_ubyte),
                ('Timing1', c_ubyte),
                ('Mode', c_ubyte)]


class _VCI_CAN_OBJ(Structure):
    _fields_ = [('ID', c_uint),
                ('TimeStamp', c_uint),
                ('TimeFlag', c_byte),
                ('SendType', c_byte),
                ('RemoteFlag', c_byte),
                ('ExternFlag', c_byte),
                ('DataLen', c_byte),
                ('Data', c_byte*8),
                ('Reserved', c_byte*3)]


vic = _VCI_INIT_CONFIG()
vic.AccCode = 0x00000000
vic.AccMask = 0xffffffff
vic.Filter = 0
vic.Timing0 = 0x00
vic.Timing1 = 0x1c
vic.Mode = 0

vco = _VCI_CAN_OBJ()
vco.ID = 0x00000001
vco.SendType = 0
vco.RemoteFlag = 0
vco.ExternFlag = 0
vco.DataLen = 8
vco.Data = (1, 2, 3, 4, 5, 6, 7, 8)


canLib = windll.LoadLibrary('.\\CAN_Lib\\'+platform.architecture()[0]+'\\ControlCAN.dll')
print('打开设备: %d' % (canLib.VCI_OpenDevice(21, 0, 0)))
print('设置波特率: %d' % (canLib.VCI_SetReference(21, 0, 0, 0, pointer(c_int(0x060003)))))
print('初始化: %d' % (canLib.VCI_InitCAN(21, 0, 0, pointer(vic))))
print('启动: %d' % (canLib.VCI_StartCAN(21, 0, 0)))
print('清空缓冲区: %d' % (canLib.VCI_ClearBuffer(21, 0, 0)))

while canLib.VCI_Receive(3, 0, 0, pointer(vco), 1, 50) == 0:
    pass
else:
    for d in vco.Data:
        print(d)
  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
要使用立功接口函数来完成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参数和设备编号等参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值