zlgcan优化为CAN盒子2路收发

最近在学习python,通过USBCAN-Ⅱ搭建测试环境。

1、将CAN盒子的两路CANH和CANL分别连接在一起。

2、学习包来自于ZLG发布的DEMO里面的函数库不一定是最新的,使用DEMO前,请务必下载使用最新的函数库进行替换。

型号WindowsLinux
USBCAN-II
USBCAN-II+
USBCAN-I
USBCAN-I+
USBCAN-I-mini
MiniPCIeCAN-II
版本:2.0.0.1libusb
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! ")

运行后,效果如下:


 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值