You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.2 KiB
102 lines
3.2 KiB
|
|
#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('./ControlCAN.dll')
|
|
#Linux系统下使用下面语句,编译命令:python3 python3.8.0.py
|
|
canDLL = cdll.LoadLibrary('./libcontrolcan.so')
|
|
|
|
|
|
print(CanDLLName)
|
|
|
|
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接收数据
|
|
a = ubyte_array(0, 0, 0, 0, 0, 0, 0, 0)
|
|
vci_can_obj = VCI_CAN_OBJ(0x0, 0, 0, 0, 0, 0, 0, a, b)#复位接收缓存
|
|
ret = canDLL.VCI_Receive(VCI_USBCAN2, 0, 1, byref(vci_can_obj), 2500, 0)
|
|
#print(ret)
|
|
while ret <= 0:#如果没有接收到数据,一直循环查询接收。
|
|
ret = canDLL.VCI_Receive(VCI_USBCAN2, 0, 1, byref(vci_can_obj), 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)
|
|
|