周立功CAN相关资源下载
首先,把下载的库函数文件(由上面链接下载)都放在工作目录下。库函数文件总共有三个文件:ControlCAN.h、
ControlCAN.lib、ControlCAN.dll 和一个文件夹 kerneldlls。
Module.bas 模块文件代码
'定义需要用到的数据结构
Public Type VCI_BOARD_INFO
hw_Version As Integer
fw_Version As Integer
dr_Version As Integer
in_Version As Integer
irq_num As Integer
can_num As Byte
str_Serial_Num(19) As Byte
str_hw_Type(39) As Byte
Reserved(3) As Integer
End Type
Public Type VCI_CAN_OBJ
ID As Long
TimeStamp As Long
TimeFlag As Byte
SendType As Byte
RemoteFlag As Byte
ExternFlag As Byte
DataLen As Byte
data(7) As Byte
Reserved(2) As Byte
End Type
Public Type VCI_CAN_STATUS
ErrInterrupt As Byte
regMode As Byte
regStatus As Byte
regALCapture As Byte
regECCapture As Byte
regEWLimit As Byte
regRECounter As Byte
regTECounter As Byte
Reserved As Long
End Type
Public Type VCI_ERR_INFO
ErrCode As Long
Passive_ErrData(2) As Byte
ArLost_ErrData As Byte
End Type
Public Type VCI_INIT_CONFIG
AccCode As Long
AccMask As Long
Reserved As Long
Filter As Byte
Timing0 As Byte
Timing1 As Byte
Mode As Byte
End Type
Public Type VCI_FILTER_RECORD
ExtFrame As Long
Start As Long
End As Long
End Type
Declare Function VCI_OpenDevice Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal Reserved As Long) As Long
Declare Function VCI_CloseDevice Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long) As Long
Declare Function VCI_InitCAN Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByRef InitConfig As VCI_INIT_CONFIG) As Long
Declare Function VCI_ReadBoardInfo Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByRef info As VCI_BOARD_INFO) As Long
Declare Function VCI_ReadErrInfo Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByRef ErrInfo As VCI_ERR_INFO) As Long
Declare Function VCI_ReadCANStatus Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByRef CANStatus As VCI_CAN_STATUS) As Long
Declare Function VCI_GetReference Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByVal RefType As Long, ByRef data As Any) As Long
Declare Function VCI_SetReference Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByVal RefType As Long, ByRef data As Any) As Long
Declare Function VCI_GetReceiveNum Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long) As Long
Declare Function VCI_ClearBuffer Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long) As Long
Declare Function VCI_StartCAN Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long) As Long
Declare Function VCI_ResetCAN Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long) As Long
Declare Function VCI_Transmit Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByRef Send As VCI_CAN_OBJ, ByVal length As Long) As Long
Declare Function VCI_Receive Lib "ControlCAN.dll" (ByVal DeviceType As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByRef Receive As VCI_CAN_OBJ, ByVal length As Long, ByVal WaitTime As Long) As Long
窗体代码
'下面以USBCAN-I设备为例:
Private Sub Form_Load()
Dim InitConfig As VCI_INIT_CONFIG
Dim TX_frameinfo As VCI_CAN_OBJ
Dim RX_frameinfo As VCI_CAN_OBJ
'初始化
InitConfig.AccCode = &H0
InitConfig.AccMask = &HFFFFFFFF
InitConfig.Filter = 1
InitConfig.Timing0 = &H1
InitConfig.Timing1 = &H1C
InitConfig.Mode = 0
'发送帧信息
TX_frameinfo.ID = &H18FF3010
TX_frameinfo.SendType = 0
TX_frameinfo.RemoteFlag = 0
TX_frameinfo.ExternFlag = 1
TX_frameinfo.DataLen = 8
TX_frameinfo.data(0) = &H5
TX_frameinfo.data(1) = &H1
TX_frameinfo.data(2) = &H2
TX_frameinfo.data(3) = &H3
TX_frameinfo.data(4) = &H4
TX_frameinfo.data(5) = &H5
TX_frameinfo.data(6) = &H6
TX_frameinfo.data(7) = &H7
'发送与接收数据
Debug.Print ("下面执行操作返回“1”表示操作成功!")
Debug.Print VCI_OpenDevice(3, 0, 0)
Debug.Print VCI_SetReference(3, 0, 0, 0, &H1C0008)
Debug.Print VCI_InitCAN(3, 0, 0, InitConfig)
Debug.Print VCI_StartCAN(3, 0, 0)
Debug.Print VCI_ClearBuffer(3, 0, 0)
Debug.Print VCI_Transmit(3, 0, 0, TX_frameinfo, 1)
Debug.Print "CAN接收缓存帧数:" & VCI_GetReceiveNum(3, 0, 0)
'等待CAN缓存区收到数据
While VCI_GetReceiveNum(3, 0, 0) <= 0
Wend
'从CAN缓存区读出一帧数据
Debug.Print VCI_Receive(3, 0, 0, RX_frameinfo, 100, 400)
Dim rxstr As String
For i = 0 To 7
rxstr = rxstr & RX_frameinfo.data(i)
Next
Debug.Print "收到:" & rxstr
'关闭USBCAN
VCI_CloseDevice 3, 0
End Sub
运行结果如下: