最近在学习python,通过USBCAN-Ⅱ搭建测试环境。
1、将CAN盒子的两路CANH和CANL分别连接在一起。
2、学习包来自于ZLG发布的DEMO里面的函数库不一定是最新的,使用DEMO前,请务必下载使用最新的函数库进行替换。
- zlgcan二次开发接口函数库(2022.02.24)zlgcan二次开发库2022.02.24.zip
-
Python python_20220322.zip - 顺便CAN卡的驱动也来个 解决方案在线文档
型号 | Windows | Linux |
---|---|---|
USBCAN-II USBCAN-II+ USBCAN-I USBCAN-I+ USBCAN-I-mini MiniPCIeCAN-II | 版本:2.0.0.1 | libusb usbcan_ii_linux.zip |
3、官方例程是按32位系统制作的,如果是64位系统,需要使用zlgcan二次开发库2022.02.24.zip内部的库文件替换。
4、官方例程是针对单通道运行的,稍微小改下,可以实现USBCAN-Ⅱ单盒子2路CAN通道收发数据。
# -*- coding:utf-8 -*-
# zlgcan.py
#
# ~~~~~~~~~~~~
#
# ZLGCAN API
#
# ~~~~~~~~~~~~
#
# ------------------------------------------------------------------
# Author : guochuangjian
# Last change: 21.02.2019
#
# Language: Python 2.7, 3.6
# ------------------------------------------------------------------
#
#由于源码过长,此处略去部分和zlgcan.py一样,只需替换下面部分内容
if __name__ == "__main__":
zcanlib = ZCAN()
handle = zcanlib.OpenDevice(ZCAN_USBCAN2, 0,0)
if handle == INVALID_DEVICE_HANDLE:
print("Open USBCAN-II device failed!")
exit(0)
print("Open USBCAN-II device success!")
print("device handle:%d." %(handle))
info = zcanlib.GetDeviceInf(handle)
print("Device Information:\n%s" %(info))
#Start CAN
chn0_handle = can_I_start(zcanlib, handle, 0) #open chn0
chn1_handle = can_I_start(zcanlib, handle, 1) #open chn1
print("channel handle:%d." %(chn0_handle))
print("channel handle:%d." %(chn1_handle))
#Send CAN Messages from chn0
transmit_num = 10
msgs = (ZCAN_Transmit_Data * transmit_num)()
for i in range(transmit_num):
msgs[i].transmit_type = 0 #0-正常发送,2-自发自收
msgs[i].frame.eff = 0 #0-标准帧,1-扩展帧
msgs[i].frame.rtr = 0 #0-数据帧,1-远程帧
msgs[i].frame.can_id = i
msgs[i].frame.can_dlc = 8
for j in range(msgs[i].frame.can_dlc):
msgs[i].frame.data[j] = j
ret = zcanlib.Transmit(chn0_handle, msgs, transmit_num)
print("Tranmit Num: %d." % ret)
thread=threading.Thread(target=input_thread)
thread.start()
#Receive Messages from chn1
while True:
rcv_num = zcanlib.GetReceiveNum(chn1_handle, ZCAN_TYPE_CAN) #返回值为接收缓存里面的CAN帧数
rcv_canfd_num = zcanlib.GetReceiveNum(chn1_handle, ZCAN_TYPE_CANFD) #返回值为接收缓存里面的CANFD帧数
if rcv_num:
rcv_msg, rcv_num = zcanlib.Receive(chn1_handle, rcv_num)
for i in range(rcv_num):
print("[%d]:timestamps:%d,type:CAN, id:%s, dlc:%d, eff:%d, rtr:%d, data:%s" %(i, rcv_msg[i].timestamp,
hex(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])+ ' 'for j in range(rcv_msg[i].frame.can_dlc))))
if thread.is_alive() == False:
break
#Close CAN
ret=zcanlib.ResetCAN(chn0_handle)
if ret==1:
print("ResetCAN0 success! ")
ret=zcanlib.ResetCAN(chn1_handle)
if ret==1:
print("ResetCAN1 success! ")
#Close Device
ret=zcanlib.CloseDevice(handle)
if ret==1:
print("CloseDevice success! ")
运行后,效果如下: