由于工作上的需要,经常要与USBCAN打交道,但厂家一般不会提供PYTHON的例子,于是自己摸索地写一个例子出来,以便在工作上随时可以使用PYTHON来测试可以的功能。这里的例子是使用珠海创芯科技有限公司的USBCAN接口卡,他们提供一个ControlCAN.dll,也提供了一个. h文件,如下:
的ifndef CONTROLCAN_H #定义CONTROLCAN_H////文件版本:v2.00 20150920//# include & lt; cvidef.h>//使用CVI平台开发,请使用该语句。//接口卡类型定义 #定义vci_usbcan1 3 #定义vci_usbcan2 4 #定义vci_usbcan2a 4 #定义VCI_USBCAN_E_U 20 #定义VCI_USBCAN_2E_U 21//函数调用返回状态值 #定义status_ok 1 #定义status_err 0/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -兼容ZLG的函数及数据类型- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *///1. zlgcan系列接口卡信息的数据类型。 typedef struct _VCI_BOARD_INFO { 无符号短hw_version; 无符号短fw_version; 无符号短dr_version; 无符号短in_version; 无符号短irq_num; 无符号字符can_num; char str_serial_num [20]; char str_hw_type [40]; 无符号短保留[4]; * PVCI_BOARD_INFO} VCI_BOARD_INFO;//2 .定义可以信息帧的数据类型。 typedef struct _VCI_CAN_OBJ { unsigned int id; unsigned int时间戳; 无符号字符timeflag; 无符号字符sendtype; 无符号字符remoteflag;//是否是远程帧 无符号字符externflag;//是否是扩展帧 无符号字符datalen; 无符号字符数据[8]; 无符号字符保留[3]; * PVCI_CAN_OBJ} VCI_CAN_OBJ;//3 .定义初始化能的数据类型 typedef struct _VCI_INIT_CONFIG { 无符号长acccode; 无符号长accmask; 无符号长保留; 无符号字符过滤; 无符号字符timing0; 无符号字符timing1; 无符号字符模式; * PVCI_INIT_CONFIG} VCI_INIT_CONFIG;/////////新加结构滤波器/////////typedef struct _VCI_FILTER_RECORD { 无符号长extframe;//是否为扩展帧 无符号长开始; 无符号长结束; * PVCI_FILTER_RECORD} VCI_FILTER_RECORD; #定义externc外来的“C” EXTERNC无符号长__stdcall VCI_OpenDevice(无符号长DeviceType,无符号长DeviceInd,无符号长保留); EXTERNC无符号长__stdcall VCI_CloseDevice(无符号长DeviceType,无符号长DeviceInd); EXTERNC无符号长__stdcall VCI_InitCAN(无符号长DeviceType,无符号长DeviceInd,无符号长CANInd PVCI_INIT_CONFIG pInitConfig); EXTERNC无符号长__stdcall VCI_ReadBoardInfo(无符号长DeviceType,无符号长DeviceInd PVCI_BOARD_INFO pInfo); EXTERNC无符号长__stdcall VCI_SetReference(无符号长DeviceType,无符号长DeviceInd,无符号长CANInd,无符号长RefType, void * pData); EXTERNC无符号长__stdcall VCI_GetReceiveNum(无符号长DeviceType,无符号长DeviceInd,无符号长CANInd); EXTERNC无符号长__stdcall VCI_ClearBuffer(无符号长DeviceType,无符号长DeviceInd,无符号长CANInd); EXTERNC无符号长__stdcall VCI_StartCAN(无符号长DeviceType,无符号长DeviceInd,无符号长CANInd); EXTERNC无符号长__stdcall VCI_ResetCAN(无符号长DeviceType,无符号长DeviceInd,无符号长CANInd); EXTERNC无符号长__stdcall VCI_Transmit(无符号长DeviceType,无符号长DeviceInd,无符号长CANInd PVCI_CAN_OBJ pSend,无符号长兰); EXTERNC无符号长__stdcall VCI_Receive(无符号长DeviceType,无符号长DeviceInd,无符号长CANInd PVCI_CAN_OBJ pReceive,无符号长兰,int WaitTime);/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -其他补充函数及数据结构描述- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *///USB-CAN总线适配器板卡信息的数据类型1,该类型为VCI_FindUsbDevice函数的返回参数。 typedef struct _VCI_BOARD_INFO1 { 无符号长hw_version; 无符号长fw_version; 无符号长dr_version; 无符号长in_version; 无符号长irq_num; 无符号字符can_num; 无符号字符保留; char str_serial_num [8]; char str_hw_type [16]; char str_usb_serial [4] [4]; * PVCI_BOARD_INFO1} VCI_BOARD_INFO1;//USB-CAN总线适配器板卡信息的数据类型2,该类型为VCI_FindUsbDevice函数的返回参数。为扩展更多的设备 typedef struct _VCI_BOARD_INFO2 { 无符号长hw_version; 无符号长fw_version; 无符号长dr_version; 无符号长in_version; 无符号长irq_num; 无符号字符can_num; 无符号字符保留; char str_serial_num [8]; char str_hw_type [16]; char str_usb_serial [10] [4]; * PVCI_BOARD_INFO2} VCI_BOARD_INFO2; #定义externc外来的“C” EXTERNC无符号长__stdcall VCI_GetReference2(无符号长DevType,无符号长DevIndex,无符号长CANIndex,无符号长保留,unsigned char * pData); EXTERNC无符号长__stdcall VCI_SetReference2(无符号长DevType,无符号长DevIndex,无符号长CANIndex,无符号长RefType unsigned char * pData); EXTERNC无符号长__stdcall VCI_ConnectDevice(无符号长DevType,无符号长DevIndex); EXTERNC无符号长__stdcall VCI_UsbDeviceReset(无符号长DevType,无符号长DevIndex,无符号长保留); EXTERNC无符号长__stdcall VCI_FindUsbDevice (PVCI_BOARD_INFO1 pInfo); EXTERNC无符号长__stdcall VCI_FindUsbDevice2 (PVCI_BOARD_INFO2 pInfo); # endif使用python来调用可以通讯的DLL实现方法