python调用controlcan.dll实现接收报文参考文章:
实践出真知——Python周立功CAN接口收发
https://zhuanlan.zhihu.com/p/195116941
在解析接收到的报文数据时执行报错:

原出错代码:
DevType = 4
DevIndex = 0
CANIndex = 0
vci_initconfig = VCI_INIT_CONFIG(0x00000000, 0xFFFFFFFF, 0,
1, 0x01, 0x1C, 0)
print("下面执行操作返回“1”表示操作成功!")
print('打开设备: %d' % (open_device(DevType, DevIndex, 0)))
print('设置波特率: %d' % (set_reference(DevType, DevIndex, CANIndex, 0, 0x1C0008)))
print('初始化: %d' % (ini_can(DevType, DevIndex, CANIndex, vci_initconfig)))
print('启动: %d' % (start_device(DevType, DevIndex, CANIndex)))
print('清空缓冲区: %d' % (clear_buffer(DevType, DevIndex, CANIndex)))
rxdata = _RX_CAN_OBJ()
while get_receive_num(DevType, DevIndex, CANIndex) == 0:
continue
print("接收缓存数量:", get_receive_num(DevType, DevIndex, CANIndex))
receive_res = receive_msg(DevType, DevIndex, CANIndex, rxdata, 50, 0)
if receive_res > 0:
analyse_msg(rxdata)
else:
print("接收缓存区为空")
print("接收缓存数量:", get_receive_num(DevType, DevIndex, CANIndex))
重写controlcan.dll中接收报文函数VCI_Receive得到自定义的接收报文函数receive_msg(),函数receive_msg()定义如下:
def receive_msg(DevType, DevIndex, CANIndex, pReceive, Len=50, WaitTime=100):
"""
:param DevType: 设备类型。对应不同的产品型号详见:适配器设备类型定义。
:param DevIndex: 设备索引,比如当只有一个USB-CAN适配器时,索引号为0,这时再插入一个USB-CAN适
配器那么后面插入的这个设备索引号就是1,以此类推。
:param CANIndex: CAN通道索引。第几路 CAN。即对应卡的CAN通道号,CAN1为0,CAN2为1。
:param pReceive: 用来接收的帧结构体VCI_CAN_OBJ数组的首指针。
:param Len: 用来接收的帧结构体数组的长度(本次接收的最大帧数,实际返回值小于等于这个值)。
该值为所提供的存储空间大小,适配器中为每个通道设置了2000帧的接收缓存区,用户根据
自身系统和工作环境需求,在1到2000之间选取适当的接收数组长度。一般pReceive数组大
小与Len都设置大于2000,如:2500为宜,可有效防止数据溢出导致地址冲突。同时每隔30ms
调用一次VCI_Receive为宜。(在满足应用的时效性情况下,尽量降低调用VCI_Receive的频
率,只要保证内部缓存不溢出,每次读取并处理更多帧,可以提高运行效率。)
:param WaitTime: 保留参数,默认为0
:return: 返回实际读取的帧数,=-1表示USB-CAN设备不存在或USB掉线。
"""
res = canDLL.VCI_Receive(DevType, DevIndex, CANIndex, pointer(pReceive), Len, WaitTime)
return res
使用analyse_msg函数解析一帧报文数据,函数代码如下:
def analyse_msg(vci_can_obj):
# 解析一帧数据
print("帧ID ", hex(vci_can_obj.ID))
if vci_can_obj.RemoteFlag == 0:
print("数据帧 ")
else:
print("远程帧 ")
if vci_can_obj.ExternFlag == 0:
print("标准帧 ")
else:<

本文介绍如何使用Python调用controlcan.dll库实现CAN报文的接收与解析,重点讲解了如何通过ctypes库处理多帧报文的接收,并提供了一个完整的示例代码。
最低0.47元/天 解锁文章
5111

被折叠的 条评论
为什么被折叠?



