1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Qt调用动态链接库ControlCAN.dll实例

Qt调用动态链接库ControlCAN.dll实例

时间:2020-07-08 19:53:07

相关推荐

Qt调用动态链接库ControlCAN.dll实例

注意:

controlCan引用静态库时需要将kerneldlls文件夹放置程序的输出路径下设备才能链接成功

首先添加外部库文件(lib文件)

一.添加第三方的头文件

这个问题再简单不过了,不过我还是要说下。

首先,添加头文件 #include "ControlCAN.h"

然后,再将这个头文件放到工程的目录下,就OK了,非常的简单

二.添加.lib文件

首先,将.lib文件放到对应的工程目录下(当然,放到其他路径也可以)。

但是,仅仅做这一步是不行的,工程不会主动去包含这个.lib文件,你必须告诉他,lib文件在哪里,才可以。

然后,在QT的工程中,你会看到一个.pro文件,比如,我的工程名为test_qt,那么我的文件就是test_qt.pro文件,在整个QT界面的左上角,.pro文件是管理整个工程的,当要打开一个工程的时候,只要打开.pro,就可以打开整个工程的所有东西。

所以,我们要做的,就是在.pro文件中,加上一句话,告诉工程,.lib在哪里

LIBS += -LE:/project/QT/usbcan_info/ -lControlCAN

下面对这句话进行解析:

1)+=这个符号是连接在一起的,不要自做聪明,给分开了,写成+ = ,这样就是错的!

2)+=的左右两边可以有空格,也可以没有空格,随意的

3)-L之后紧接着就跟着.lib文件所在的目录,比如,我的目录是在E盘下的project目录下的QT目录下的usbcan_info下,注意,是紧跟着,不要分开,分开就错啦!

4)-l后面跟着的是.lib的文件名,注意,比如你的.lib文件时ControlCAN.lib,不要傻乎乎的写成了-lControlCAN.lib,不要带后缀,要写成-lControlCAN,同样,-l后面也没有空格

完成以上的操作,就可以指定.lib文件了。其实说穿了很简单,就是把.lib随便放到一个目录下,然后告诉工程,你的.lib放到哪里了,叫什么名字。

三.添加.dll文件

一个工程编译成功后,会在工程目录下生成2个目录,一个是debug目录,一个是release目录(注意,如果一个工程刚刚新建,是没有这2二个目录的,不信的朋友可以看看)。

其中,debug就叫做输出目录!因为工程编译后的.exe就在这个目录下。

然后,将.dll文件放到这个目录下。

/*****************************

1.

将ControlCAN.dll和ControlCAN.h拷贝到工程源文件所在的文件夹下

2.

在 工程名.pro 文件内加入,如图所示

LIBS += D:/Qt/CAN_ComPro/debug/ControlCAN.dll

3.

库函数的显示调用(以 VCI_OpenDevice为例):

#include <QLibrary>

#include <QDebug>

#include "ControlCAN.h"

typedef DWORD(__stdcall VCI_OpenDevice)(DWORD,DWORD,DWORD);

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

//导入库

QLibrary lib("ControlCAN.dll");

if(true==lib.load())

qDebug()<<"dll load ok";

//从库中解析函数

pOpenDevice = (VCI_OpenDevice *)lib.resolve("VCI_OpenDevice");

//调用函数

pOpenDevice(4, 0, 0);

return a.exec();

}

/*******************************

1 连接USB-CAN II设备

示例代码如下:

void Ctbox_CarSimulatorDlg::OnBnClickedBtConnect()

{

// TODO: Add your control notification handler code here

if(m_connect ==true){ //如果已经连接

m_connect =false;

Sleep(500);

GetDlgItem(IDC_BT_CONNECT)->SetWindowText("连接");

VCI_CloseDevice(VCI_USBCAN2,0);

return;

}

//如果未连接

UpdateData(true);

VCI_INIT_CONFIG init_config;

memset(&init_config,0,sizeof(VCI_INIT_CONFIG));

init_config.AccCode=0;//验收码

init_config.AccMask=0xffffffff;//屏蔽码

init_config.Filter=1; //过滤方式

init_config.Mode=0;//模式

init_config.Timing0=0; //定时器0

init_config.Timing1=0x1c; //定时器1

//打开设备

if(VCI_OpenDevice(VCI_USBCAN2,0,0)!=STATUS_OK)

{

MessageBox("打开设备失败!","警告",MB_OK|MB_ICONQUESTION);

return;

}

//初始化CAN

if(VCI_InitCAN(VCI_USBCAN2,0,m_channel_sel,&init_config)!=STATUS_OK)

{

MessageBox("初始化CAN失败!","警告",MB_OK|MB_ICONQUESTION);

VCI_CloseDevice(0,0);

return;

}

//启动CAN

if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)

{

MessageBox("启动CAN失败!","警告",MB_OK|MB_ICONQUESTION);

VCI_CloseDevice(0,0);

return;

}

m_connect=1;

GetDlgItem(IDC_BT_CONNECT)->SetWindowText("断开");

}

注:这里,定时器0必须设备为0,定时器必须设备为0x1c,在PC上才能正常工作,不然调用发送接口时老是会返回错误。

2 发送CAN消息

VCI_CAN_OBJ frameinfo;

frameinfo.DataLen =8;

frameinfo.RemoteFlag =0;

frameinfo.ExternFlag =0;

frameinfo.SendType =0;

frameinfo.ID =CAN_ID_LOCK;

frameinfo.Data[1] =lock;

VCI_Transmit(VCI_USBCAN2,0,dlg->m_channel_sel,&frameinfo,1);

3 接收CAN消息

接收CAN消息一般是通过个线程来实现,如下:

UINT Ctbox_CarSimulatorDlg::ReceiveThread(void * param)

{

Ctbox_CarSimulatorDlg *dlg =(Ctbox_CarSimulatorDlg *)param;

VCI_CAN_OBJ frameinfo[50];

VCI_ERR_INFO errinfo;

int len=1;

int i=0;

while(1){

Sleep(100);

if(!dlg->m_connect){

continue;

}

len=VCI_Receive(VCI_USBCAN2,0,dlg->m_channel_sel,frameinfo,50,200);

if(len<=0){

//注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,

//千万不能省略这一步(即使你可能不想知道错误码是什么)

VCI_ReadErrInfo(VCI_USBCAN2,0,dlg->m_channel_sel,&errinfo);

}

else{

//数据处理

for(i=0;i<len;i++){

switch(frameinfo[i].ID){

case CANID_RC_HEAD_LIGHT:

case CANID_RC_HORN:

case CANID_RC_LOCK:

dlg->m_remote_control_page.SetStatus(frameinfo[i].ID,8,frameinfo[i].Data);

break;

default:

break;

}

}

}

}

return 0;

}

在对话框的初始化函数中启动此接收线程:

AfxBeginThread(ReceiveThread,this);

4 复位CAN

void Ctbox_CarSimulatorDlg::OnBnClickedBtReset()

{

// TODO: Add your control notification handler code here

if(m_connect==0){

AfxMessageBox("还未连接!",0);

return;

}

//复位CAN

if(VCI_ResetCAN(VCI_USBCAN2,0,m_channel_sel)!=1)

{

AfxMessageBox("复位失败",0);

}

//启动CAN

if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)

{

MessageBox("启动CAN失败!","警告",MB_OK|MB_ICONQUESTION);

VCI_CloseDevice(0,0);

return;

}

AfxMessageBox("复位成功",0);

}

5 其它

工程中必须包含SDK中提供到lib文件及头文.

即可VS的工程属性页面的Linker->Input->Addtional Dependencies一栏中设置为:./ControlCAN.lib;%(AdditionalDependencies)

然后将.cpp文件中包含头文:

#include "ControlCAN.h"

最后需要将USB-CAN II SDK中提供的ControlCAN.dll及kerneldlls文件夹拷贝到工程目录下,程序才能正常运行。

如上示例代码即可操作USB-CAN II设备。

参考资料:CAN 接口函数库(二次开发库) - 豆丁网

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。