CANalyst—Ⅱ 连通与手动收发测试、python收发测试
目录
一、设备连通步骤
二、手动测试步骤
三、python收发测试
一、设备连通步骤
1. 将CANalyst—Ⅱ按照如下方式接线方式连接
实物图
2. USB一端连电脑,另一端连CANalyst—Ⅱ
3.安装USB-CAN Tool 调试软件
除了不想安装到C盘外,其它步骤一直点下一步就行
下载链接:
https://pan.baidu.com/s/1-_OvIwui0VXQS46-12sa6Q?pwd=o67h
提取码:o67h
安装完毕后:
4.运行USB-CAN Tool
4.1 USB-CAN Tool 界面菜单中,点击“设备操作-》USBCAN 测试工具”:
4.2 接好线,插入设备,点击左上角的“打开并测试”按钮,软件会自动测试(依次打开设备->初始化 CAN1/CAN2 两个通道->CAN1 发送一个序列、CAN2 接收并校验->CAN2发送一个序列、CAN1 接收并校验->关闭设备->结果显示):
点击后:
此时CANalyst—Ⅱ会有灯光闪烁:
如果出现以下结果,请按提示检查接线、终端电阻配置,插拔 USB 重新测试:
二、手动测试步骤
1.在弹出的 USB-CAN Tool 界面菜单中,点击“设备操作-》启动设备”:
2.在接下来弹出的初始化参数对话框中,将 CAN1 通道和 CAN2 通道参数设置为相同波特率,这里将 CAN1 与 CAN2 的波特率配置为 500K,单击“确定”即可:
3.打开成功后,在界面上选择 CAN1 通道,点击“发送”按钮发送一帧数据,此时 CAN2 通道将接收一帧相同的数据,说明 CAN1 通道发送正常,CAN2 通道接收正常。
然后切换发送通道为CAN2 通道,点击“发送”按钮发送一帧数据,此时 CAN1 通道将接收一帧相同的数据,说明 CAN2 通道发送正常,CAN1 通道接收正常。
三、python收发测试
在执行完 一、设备连通步骤 后,运行如下代码:
#python3.8.0 64位(python 32位要用32位的DLL)
#
from ctypes import *
VCI_USBCAN2 = 4
STATUS_OK = 1
class VCI_INIT_CONFIG(Structure):
_fields_ = [("AccCode", c_uint),
("AccMask", c_uint),
("Reserved", c_uint),
("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_ubyte),
("SendType", c_ubyte),
("RemoteFlag", c_ubyte),
("ExternFlag", c_ubyte),
("DataLen", c_ubyte),
("Data", c_ubyte*8),
("Reserved", c_ubyte*3)
]
CanDLLName = './ControlCAN.dll' #把DLL放到对应的目录下
canDLL = windll.LoadLibrary(CanDLLName)
#Linux系统下使用下面语句,编译命令:python3 python3.8.0.py
#canDLL = cdll.LoadLibrary('./libcontrolcan.so')
ret = canDLL.VCI_OpenDevice(VCI_USBCAN2, 0, 0)
if ret == STATUS_OK:
print('调用 VCI_OpenDevice成功\r\n')
if ret != STATUS_OK:
print('调用 VCI_OpenDevice出错\r\n')
#初始0通道
vci_initconfig = VCI_INIT_CONFIG(0x80000008, 0xFFFFFFFF, 0, 0, 0x03, 0x1C, 0) #波特率125k,正常模式
ret = canDLL.VCI_InitCAN(VCI_USBCAN2, 0, 0, byref(vci_initconfig))
if ret == STATUS_OK:
print('调用 VCI_InitCAN1成功\r\n')
if ret != STATUS_OK:
print('调用 VCI_InitCAN1出错\r\n')
ret = canDLL.VCI_StartCAN(VCI_USBCAN2, 0, 0)
if ret == STATUS_OK:
print('调用 VCI_StartCAN1成功\r\n')
if ret != STATUS_OK:
print('调用 VCI_StartCAN1出错\r\n')
#初始1通道
ret = canDLL.VCI_InitCAN(VCI_USBCAN2, 0, 1, byref(vci_initconfig))
if ret == STATUS_OK:
print('调用 VCI_InitCAN2 成功\r\n')
if ret != STATUS_OK:
print('调用 VCI_InitCAN2 出错\r\n')
ret = canDLL.VCI_StartCAN(VCI_USBCAN2, 0, 1)
if ret == STATUS_OK:
print('调用 VCI_StartCAN2 成功\r\n')
if ret != STATUS_OK:
print('调用 VCI_StartCAN2 出错\r\n')
#通道1发送数据
ubyte_array = c_ubyte*8
a = ubyte_array(1, 2, 3, 4, 5, 6, 7, 8)
ubyte_3array = c_ubyte*3
b = ubyte_3array(0, 0, 0)
vci_can_obj = VCI_CAN_OBJ(0x1, 0, 0, 1, 0, 0, 8, a, b)#单次发送
ret = canDLL.VCI_Transmit(VCI_USBCAN2, 0, 0, byref(vci_can_obj), 1)
if ret == STATUS_OK:
print('CAN1通道发送成功\r\n')
if ret != STATUS_OK:
print('CAN1通道发送失败\r\n')
#通道2接收数据
#结构体数组类
import ctypes
class VCI_CAN_OBJ_ARRAY(Structure):
_fields_ = [('SIZE', ctypes.c_uint16), ('STRUCT_ARRAY', ctypes.POINTER(VCI_CAN_OBJ))]
def __init__(self,num_of_structs):
#这个括号不能少
self.STRUCT_ARRAY = ctypes.cast((VCI_CAN_OBJ * num_of_structs)(),ctypes.POINTER(VCI_CAN_OBJ))#结构体数组
self.SIZE = num_of_structs#结构体长度
self.ADDR = self.STRUCT_ARRAY[0]#结构体数组地址 byref()转c地址
rx_vci_can_obj = VCI_CAN_OBJ_ARRAY(2500)#结构体数组
ret = canDLL.VCI_Receive(VCI_USBCAN2, 0, 1, byref(rx_vci_can_obj.ADDR), 2500, 0)
#print(ret)
while ret <= 0:#如果没有接收到数据,一直循环查询接收。
ret = canDLL.VCI_Receive(VCI_USBCAN2, 0, 1, byref(rx_vci_can_obj.ADDR), 2500, 0)
if ret > 0:#接收到一帧数据
print('CAN2通道接收成功\r\n')
print('ID:')
print(vci_can_obj.ID)
print('DataLen:')
print(vci_can_obj.DataLen)
print('Data:')
print(list(vci_can_obj.Data))
#关闭
canDLL.VCI_CloseDevice(VCI_USBCAN2, 0)
ControlCAN.dll文件下载地址:
ControlCAN.dll(64位)-Python文档类资源-CSDN下载
运行结果: