1、广成科技 USB CAN接口函数库(ECanVci.dll)使用手册V5.2沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.修订历史版本 日期 原因V5.1 2013/6/16 创建文档V5.2 2015/9/10 添加部分参数沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.目 录1 接口函数库说明及其使用.11.1 接口卡设备类型定义.11.2 错误码定义.11.3 接口库函数结构体.21.3.1
2、BOARD_INFO.21.3.2 CAN_OBJ.31.3.3 CAN_STATUS.41.3.4 ERR_INFO.51.3.5 INIT_CONFIG .61.3.6 FILTER_RECORD .81.4 接口库函数说明.91.4.1 OpenDevice.91.4.2 CloseDevice .101.4.3 InitCan .111.4.4 ReadBoardInfo .121.4.5 ReadErrInfo.131.4.6 ReadCanStatus .171.4.7 GetReference .181.4.8 SetReference.191.4.9 GetReceiveNum
3、.201.4.10 ClearBuffer .211.4.11 StartCAN .221.4.12 Transmit.231.4.13 Receive .241.4.14 ResetCAN .251.5 接口库函数使用方法.261.5.1 VC 调用动态库的方法261.5.2 VB 调用动态库的方法261.6 接口库函数.27销售与服务.28沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.11 接口函数库说明及其使用1.1 接口卡设备类型定义各个接口卡的类型定义如下:设备名称 设备类型号USBC
4、AN-I 3USBCAN-II 41.2 错误码定义名称 值 描述ERR_CAN_OVERFLOW 0x00000001 CAN控制器内部FIFO溢出ERR_CAN_ERRALARM 0x00000002 CAN控制器错误报警ERR_CAN_PASSIVE 0x00000004 CAN控制器消极错误ERR_CAN_LOSE 0x00000008 CAN控制器仲裁丢失ERR_CAN_BUSERR 0x00000010 CAN控制器总线错误ERR_CAN_REG_FULL 0x00000020 CAN接收寄存器满ERR_CAN_REC_OVER 0x00000040 CAN接收寄存器溢出ERR_C
5、AN_ACTIVE 0x00000080 CAN控制器主动错误ERR_DEVICEOPENED 0x00000100 设备已经打开ERR_DEVICEOPEN 0x00000200 打开设备错误ERR_DEVICENOTOPEN 0x00000400 设备没有打开ERR_BUFFEROVERFLOW 0x00000800 缓冲区溢出ERR_DEVICENOTEXIST 0x00001000 此设备不存在ERR_LOADKERNELDLL 0x00002000 装载动态库失败ERR_CMDFAILED 0x00004000 执行命令失败错误码ERR_BUFFERCREATE 0x00008000
6、 内存不足沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.21.3 接口库函数结构体1.3.1 BOARD_INFO描述BOARD_INFO结构体包含ECAN系列接口卡的设备信息。结构体将在ReadBoardInfo函数中被填充。typedef struct _BOARD_INFO USHORT hw_Version;USHORT fw_Version;USHORT dr_Version;USHORT in_Version;USHORT irq_Num;BYTE can_Num;CHAR str_
7、Serial_Num20;CHAR str_hw_Type40;USHORT Reserved4; BOARD_INFO, *P_BOARD_INFO;成员hw_Version硬件版本号,用16进制表示。fw_Version固件版本号,用16进制表示。dr_Version驱动程序版本号,用16进制表示。in_Version接口库版本号,用16进制表示。irq_Num板卡所使用的中断号。can_Num表示有几路CAN通道。str_Serial_Num此板卡的序列号。str_hw_Type硬件类型。Reserved系统保留。沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册
8、 ShenyangGuangchengTechnologyCO.LTD.31.3.2 CAN_OBJ描述CAN_OBJ结构体表示帧的数据结构。在发送函数Transmit和接收函数Receive中被用来传送CAN信息帧。typedef struct _CAN_OBJ UINT ID;UINT TimeStamp;BYTE TimeFlag;BYTE SendType;BYTE RemoteFlag;BYTE ExternFlag;BYTE DataLen;BYTE Data8;BYTE Reserved3; CAN_OBJ, *P_CAN_OBJ;成员ID 报文帧ID。TimeStamp接收到信
9、息帧时的时间标识,从CAN控制器初始化开始计时,单位微秒。TimeFlag是否使用时间标识,为1时TimeStamp有效,TimeFlag和TimeStamp只在此帧为接收帧时有意义。SendType发送帧类型。=0时为正常发送,=1时为单次发送(不自动重发),=2时为自发自收(用于测试CAN卡是否损坏),=3时为单次自发自收(只发送一次,用于自测试),只在此帧为发送帧时有意义。RemoteFlag是否是远程帧。=0时为数据帧,=1时为远程帧。ExternFlag是否是扩展帧。=0时为标准帧(11位帧ID),=1时为扩展帧(29位帧ID)。DataLen数据长度DLC(AccCode AccC
10、ode对应SJA1000中的四个寄存器ACR0,ACR1,ACR2,ACR3,其中高字节对应ACR0,低字节对应ACR3;AccMask对应SJA1000中的四个寄存器AMR0,AMR1,AMR2,AMR3,其中高字节对应AMR0,低字节对应AMR3。(请看表后说明)pInitConfig-AccMaskpInitConfig-Reserved 保留pInitConfig-Filter 滤波使能,0为不使能,1为使能pInitConfig-Timing0 波特率定时器0pInitConfig-Timing1 波特率定时器1pInitConfig-Mode 模式,0表示正常模式,1表示只听模式返
11、回值为1表示操作成功,0表示操作失败。示例#include “ECanVci.h“int nDeviceType = 3; / USBCAN-Iint nDeviceInd = 0; / 索引号为0int nCANInd = 0;int nReserved = 0;DWORD dwRel;dwRel = OpenDevice(nDeviceType, nDeviceInd, nReserved);if (dwRel != STATUS_OK)MessageBox(_T(“打开设备失败!“), _T(“警告“), MB_OK|MB_ICONQUESTION);沈阳广成科技有限公司 USBCAN
12、Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.121.4.4 ReadBoardInfo描述此函数用以获取设备信息。DWORD _stdcall ReadBoardInfo(DWORD DevType, DWORD DevIndex,P_BOARD_INFO pInfo);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。pInfo用来存储设备信息的BOARD_INFO结构指针。返回值为1表示操作成功,0表示操作失败。示例#include “ECanVci.h“int
13、 nDeviceType = 3; / USBCAN-Iint nDeviceInd = 0;int nCANInd = 0;INIT_CONFIG vic;BOARD_INFO vbi;DWORD dwRel;dwRel = ReadBoardInfo(nDeviceType, nDeviceInd, nCANInd, 沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.131.4.5 ReadErrInfo描述此函数用以获取USBCAN分析仪最后一次错误信息。DWORD _stdcall Read
14、ErrInfo(DWORD DevType, DWORD DevIndex, DWORDCANIndex, P_ERR_INFO pErrInfo);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN通道。pErrInfo用来存储错误信息的ERR_INFO结构指针。pErrInfo-ErrCode可能为下列各个错误码的多种组合之一:ErrCode Passive_ErrData ArLost_ErrData 错误描述0x0100 无 无 设备已经打开0x0200 无 无 打开设备错误0x0400 无 无
15、 设备没有打开0x0800 无 无 缓冲区溢出0x1000 无 无 此设备不存在0x2000 无 无 装载动态库失败0x4000 无 无 表示为执行命令失败错误0x8000 无 无 内存不足0x0001 无 无 CAN控制器内部FIFO溢出0x0002 无 无 CAN控制器错误报警0x0004 有,具体值见表后 无 CAN控制器消极错误0x0008 无 有,具体值见表后 CAN控制器仲裁丢失0x0010 无 无 CAN控制器总线错误0x0020 CAN接收寄存器满0x0040 CAN接收寄存器溢出0x0080 有,具体值见表后 CAN控制器主动错误返回值为1表示操作成功,0表示操作失败。备注当
16、(PErrInfo-ErrCode / USBCAN-Iint nDeviceInd = 0;int nCANInd = 0;ERR_INFO vei;DWORD dwRel;dwRel = ReadErrInfo(nDeviceType, nDeviceInd, nCANInd, 沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.171.4.6 ReadCanStatus描述此函数用以获取CAN状态。DWORD _stdcall ReadCanStatus(DWORD DevType, DWORD
17、 DevIndex, DWORDCANIndex, P_CAN_STATUS pCANStatus);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。pCANStatus用来存储CAN状态的CAN_STATUS结构指针。返回值为1表示操作成功,0表示操作失败。示例#include “ECanVci.h“int nDeviceType = 4; / USBCAN-IIint nDeviceInd = 0;int nCANInd = 0;INIT_CONFIG vic;CAN_STATUS vcs;DW
18、ORD dwRel;dwRel = ReadCanStatus(nDeviceType, nDeviceInd, nCANInd, 沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.181.4.7 GetReference描述此函数用以获取设备的相应参数。DWORD _stdcall GetReference(DWORD DevType, DWORD DevIndex, DWORDCANIndex, DWORD RefType, PVOID pData);参数DevType设备类型号。DevInde
19、x设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。RefType参数类型。pData用来存储参数有关数据缓冲区地址首指针。返回值为1表示操作成功,0表示操作失败。示例#include “ECanVci.h“int nDeviceType = 4; / USBCAN-IIint nDeviceInd = 0;int nCANInd = 0;BYTE info14;DWORD dwRel;info0 = 1;dwRel = GetReference(nDeviceType, nDeviceInd, nCANInd, 1, (PVOID)info);
20、沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.191.4.8 SetReference描述此函数用以设置设备的相应参数,主要处理不同设备的特定操作。DWORD _stdcall SetReference(DWORD DevType, DWORD DevIndex, DWORDCANIndex, DWORD RefType, PVOID pData);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。Re
21、fType参数类型。pData用来存储参数有关数据缓冲区地址首指针。返回值为1表示操作成功,0表示操作失败。示例#include “ECanVci.h“int nDeviceType = 3; / USBCAN-Iint nDeviceInd = 0;int nCANInd = 0;BYTE baud;DWORD dwRel;baud = 0;dwRel = SetReference(nDeviceType, nDeviceInd, nCANInd, 1, (PVOID)baud);沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangcheng
22、TechnologyCO.LTD.201.4.9 GetReceiveNum描述此函数用以获取指定接收缓冲区中接收到但尚未被读取的帧数量。ULONG _stdcall GetReceiveNum(DWORD DevType, DWORD DevIndex, DWORDCANIndex);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。返回值返回尚未被读取的帧数。示例#include “ECanVci.h“int nDeviceType =3; / USBCAN-Iint nDeviceInd = 0
23、;int nCANInd = 0;DWORD dwRel;dwRel = GetReceiveNum(nDeviceType, nDeviceInd, nCANInd);沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.211.4.10 ClearBuffer描述此函数用以清空指定CAN通道的缓冲区。DWORD _stdcall ClearBuffer(DWORD DevType, DWORD DevIndex, DWORDCANIndex);参数DevType设备类型号。DevIndex设备索引号
24、,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。返回值为1表示操作成功,0表示操作失败。示例#include “ECanVci.h“int nDeviceType = 3; / USBCAN-Iint nDeviceInd = 0;int nCANInd = 0;DWORD dwRel;dwRel = ClearBuffer(nDeviceType, nDeviceInd, nCANInd);沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.221.4.11
25、StartCAN描述此函数用以启动USBCAN设备的某一个CAN通道。如有多个CAN通道时,需要多次调用。DWORD _stdcall StartCAN(DWORD DevType, DWORD DevIndex, DWORD CANIndex);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。返回值为1表示操作成功,0表示操作失败。示例#include “ECanVci.h“int nDeviceType =3; / USBCAN-Iint nDeviceInd = 0;int nCANInd =
26、 0;int nReserved = 0;INIT_CONFIG vic;DWORD dwRel;dwRel = OpenDevice(nDeviceType, nDeviceInd, nReserved);if (dwRel != STATUS_OK)MessageBox(_T(“打开设备失败!“), _T(“警告“), MB_OK|MB_ICONQUESTION);return FALSE;dwRel = InitCAN(nDeviceType, nDeviceInd, nCANInd, if (dwRel = STATUS_ERR) CloseDevice(nDeviceType, nD
27、eviceInd);MessageBox(_T(“初始化设备失败!“), _T(“警告“), MB_OK|MB_ICONQUESTION);return FALSE;dwRel = StartCAN(nDeviceType, nDeviceInd, nCANInd);if (dwRel = STATUS_ERR) CloseDevice(nDeviceType, nDeviceInd);MessageBox(_T(“启动设备失败!“), _T(“警告“), MB_OK|MB_ICONQUESTION);return FALSE;沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品
28、使用手册 ShenyangGuangchengTechnologyCO.LTD.231.4.12 Transmit描述返回实际发送成功的帧数量。ULONG _stdcall Transmit(DWORD DevType, DWORD DevIndex, DWORD CANIndex,P_CAN_OBJ pSend, ULONG Len);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。pSend要发送的数据帧数组的首指针。Len要发送的数据帧数组的长度。返回值返回实际发送的帧数。示例#include
29、 “ECanVci.h“#include int nDeviceType = 3; / USBCAN-Iint nDeviceInd = 0;int nCANInd = 0;DWORD dwRel;CAN_OBJ vco;ZeroMemory(vco.ID = 0x00000000;vco.SendType = 0;vco.RemoteFlag = 0;vco.ExternFlag = 0;vco.DataLen = 8;dwRel = Transmit(nDeviceType, nDeviceInd, nCANInd, 沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手
30、册 ShenyangGuangchengTechnologyCO.LTD.241.4.13 Receive描述此函数从指定的设备CAN通道的缓冲区里读取数据。ULONG _stdcall Receive(DWORD DevType, DWORD DevIndex, DWORD CANIndex,P_CAN_OBJ pReceive, ULONG Len, INT WaitTime=1);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。pReceive用来接收的数据帧数组的首指针。Len用来接收的数据
31、帧数组的长度。WaitTime等待超时时间,以毫秒为单位。返回值返回实际读取到的帧数。如果返回值为0xFFFFFFFF,则表示读取数据失败,有错误发生,请调用ReadErrInfo函数来获取错误码。示例#include “ECanVci.h“#include int nDeviceType = 3; / USBCAN-Iint nDeviceInd = 0;int nCANInd = 0;DWORD dwRel;CAN_OBJ vco100;dwRel = Receive(nDeviceType, nDeviceInd, nCANInd, vco, 100, 10);沈阳广成科技有限公司 US
32、BCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.251.4.14 ResetCAN描述此函数用以复位CAN。如当USBCAN分析仪进入总线关闭状态时,可以调用这个函数。DWORD _stdcall ResetCAN(DWORD DevType, DWORD DevIndex, DWORD CANIndex);参数DevType设备类型号。DevIndex设备索引号,比如当只有一个设备时,索引号为0,有两个时可以为0或1。CANIndex第几路CAN。返回值为1表示操作成功,0表示操作失败。示例#include “ECanV
33、ci.h“int nDeviceType = 4;/ USBCAN-IIint nDeviceInd = 0;int nCANInd = 0;DWORD dwRel;dwRel = ResetCAN(nDeviceType, nDeviceInd, nCANInd);沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.261.5 接口库函数使用方法首先,把库函数文件都放在工作目录下。库函数文件总共有三个文件:ECanVci.h、ECanVci.lib、ECanVci.dll。1.5.1 VC调用动态库
34、的方法(1) 在扩展名为.CPP的文件中包含ECANVCI.h头文件。如:#include“ECANVci.h”(2) 在工程的连接器设置中连接到ECANVCI.lib文件。如:在VC7环境下,在项目属性页里的配置属性连接器输入附加依赖项中添加ECANVCI.lib在VC6环境下,在CPP文件中加入静态库调用:#pragma comment(lib,“ECANVCI“)1.5.2 VB调用动态库的方法通过以下方法进行声明后就可以调用了。语法:Public | Private Declare Function name Lib “libname“ Alias “aliasname“(arglis
35、t) As typeDeclare 语句的语法包含下面部分:Public(可选)用于声明在所有模块中的所有过程都可以使用的函数。Private(可选)用于声明只能在包含该声明的模块中使用的函数。Name(必选)任何合法的函数名。动态链接库的入口处(entry points)区分大小写。Libname(必选)包含所声明的函数动态链接库名或代码资源名。Alias(可选)表示将被调用的函数在动态链接库 (DLL) 中还有另外的名称。当外部函数名与某个函数重名时,就可以使用这个参数。当动态链接库的函数与同一范围内的公用变量、常数或任何其它过程的名称相同时,也可以使用 Alias。如果该动态链接库函数中
36、的某个字符不符合动态链接库的命名约定时,也可以使用 Alias。Aliasname(可选)动态链接库。如果首字符不是数字符号 (#),则 aliasname 是动态链接库中该函数入口处的名称。如果首字符是 (#),则随后的字符必须指定该函数入口处的顺序号。Arglist(可选)代表调用该函数时需要传递参数的变量表。Type(可选)Function返回值的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、沈阳广成科技有限公司 USBCAN Ecan接口函数库使用手册产品使用手册 ShenyangGuangchengTechnologyCO.LTD.27Sin
37、gle、Double、Decimal(目前尚不支持)、Date、String(只支持变长)或Variant,用户定义类型,或对象类型。arglist 参数的语法如下:Optional ByVal | ByRef ParamArray varname( ) As type部分描述:Optional(可选)表示参数不是必需的。如果使用该选项,则 arglist 中的后续参数都必需是可选的,而且必须都使用Optional 关键字声明。如果使用了 ParamArray,则任何参数都不能使用 Optional。ByVal(可选)表示该参数按值传递。ByRef(可选)表示该参数按地址传递。例如:Publi
38、c Declare Function OpenDevice Lib “ECANVCI“ (ByVal devicetype AsLong, ByVal deviceind As Long, ByVal reserved As Long) As Long1.6 接口库函数OpenDevice(DWORDDeviceType,DWORDDeviceInd,DWORDReserved);CloseDevice(DWORDDeviceType,DWORD DeviceInd);InitCAN(DWORDDeviceType, DWORDDeviceInd, DWORD CANInd, P_INIT_C
39、ONFIG pInitConfig);ReadBoardInfo(DWORDDeviceType,DWORDDeviceInd,P_BOARD_INFO pInfo);ReadErrInfo(DWORDDeviceType,DWORDDeviceInd,DWORDCANInd,P_ERR_INFO pErrInfo);ReadCANStatus(DWORDDeviceType,DWORDDeviceInd,DWORDCANInd,P_CAN_STATUS pCANStatus);GetReference(DWORDDeviceType,DWORDDeviceInd,DWORDCANInd,DW
40、ORD RefType,PVOID pData);SetReference(DWORDDeviceType,DWORDDeviceInd,DWORD CANInd,DWORDRefType,PVOID pData);GetReceiveNum(DWORDDeviceType,DWORDDeviceInd,DWORDCANInd);ClearBuffer(DWORDDeviceType,DWORDDeviceInd,DWORDCANInd);StartCAN(DWORDDeviceType,DWORDDeviceInd,DWORDCANInd);ResetCAN(DWORDDeviceType,DWORDDeviceInd,DWORD CANInd);Transmit(DWORDDeviceType,DWORDDeviceInd,DWORDCANInd,P_CAN_OBJ pSend,ULONG Len);Receive(DWORDDeviceType,DWORD DeviceInd,DWORDCANInd,P_CAN_OBJ pReceive,ULONG Len,INT WaitTime);