qt5 显示调用CAN卡第三方库并调用函数

Qt调用CAN卡DLL教程

 Qt调用第三方库一般有两种方式,显示和隐式。这里主要介绍显示调用CAN卡第三方库(因为隐式调用CAN失败了,太懒,不想弄了尴尬),简单介绍隐式调用。

一、隐式调用

  1. 创建工程
  2. 将xx.h和xx.lib放入当前工程目录
  3. xx.dll文件放入debug和release文件夹中(编译后自动生成)
  4. 工程下打开.pro文件,右键选择添加库”
  5. 选择“外部库”、“动态库”
  6. 工程添加头文件xx.h
  7. 头文件包含“xx.h"
二、显式调用
1、创建工程
2、CAN.lib文件夹里有几个文件如下。Kerneldlls中有很多xx.dll文件,如下。将使用的CAN类型对应的.dll文件复制(我使用的是usbcan,所以是usbcan.dll),放到工作目录下,同时复制ControlCAN.h到工作目录下。

文件
库文件
3、包含ControlCAN.h到工程中
4、使用QLibrary加载动态库
QLibrary lib("usbcan.dll");
    if(true==lib.load())
        qDebug()<<"dll load ok";
5、声明与usbcan.dll里的函数功能相对应的函数,在头文件中添加:
public:
    typedef DWORD(__stdcall VCI_OpenDevice)(DWORD,DWORD,DWORD);
    typedef DWORD(__stdcall VCI_ResetCAN)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
    typedef DWORD(__stdcall VCI_CloseDevice)(DWORD DeviceType,DWORD DeviceInd);
    typedef DWORD(__stdcall VCI_InitCAN)(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);
    typedef DWORD(__stdcall VCI_StartCAN)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
    typedef ULONG(__stdcall VCI_Transmit)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,ULONG Len);

    typedef ULONG(__stdcall VCI_Receive)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime/*=-1*/);
    typedef ULONG(__stdcall VCI_GetReceiveNum)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
    typedef DWORD(__stdcall VCI_ClearBuffer)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
    typedef DWORD(__stdcall VCI_ReadErrInfo)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_ERR_INFO pErrInfo);
    typedef DWORD(__stdcall VCI_ReadCANStatus)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_STATUS pCANStatus);
    typedef DWORD(__stdcall VCI_SetReference)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData);
    typedef DWORD(__stdcall VCI_ReadBoardInfo)(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo);
6、声明函数对象,如
    VCI_OpenDevice *pOpenDevice;
    VCI_ResetCAN *pResetCAN;
    VCI_CloseDevice *pCloseDevice;
    VCI_InitCAN *pInitCAN;
    VCI_StartCAN *pStartCAN;
    VCI_Transmit *pTransmitCAN;
    VCI_Receive *pReceive;
    VCI_GetReceiveNum *pGetReceiveNum;
    VCI_ClearBuffer *pClearBuffer;
    VCI_ReadErrInfo *pReadErrInfoCAN;
    VCI_ReadCANStatus *pReadCANStatus;
    VCI_SetReference *pSetReference;
    VCI_ReadBoardInfo *pReadBoardInfo;
7、将usbcan.dll中的函数功能分解到自定义对应的函数中,源文件中:
pOpenDevice = (VCI_OpenDevice *)lib.resolve("VCI_OpenDevice");
    pCloseDevice = (VCI_CloseDevice *)lib.resolve("VCI_CloseDevice");
    pInitCAN = (VCI_InitCAN *)lib.resolve("VCI_InitCAN");
    pStartCAN = (VCI_StartCAN *)lib.resolve("VCI_StartCAN");
    pTransmitCAN = (VCI_Transmit *)lib.resolve("VCI_Transmit");
    pReceive = (VCI_Receive *)lib.resolve("VCI_Receive");
    pGetReceiveNum = (VCI_GetReceiveNum *)lib.resolve("VCI_GetReceiveNum");
    pClearBuffer = (VCI_ClearBuffer *)lib.resolve("VCI_ClearBuffer");
    pReadErrInfoCAN = (VCI_ReadErrInfo*)lib.resolve("VCI_ReadErrInfo");
    pResetCAN=(VCI_ResetCAN *)lib.resolve("VCI_ResetCAN");
    pSetReference=(VCI_SetReference *)lib.resolve("VCI_SetReference");
    pReadBoardInfo=(VCI_ReadBoardInfo *)lib.resolve("VCI_ReadBoardInfo");
    pReadCANStatus=(VCI_ReadCANStatus *)lib.resolve("VCI_ReadCANStatus");








评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值