日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt调用动态链接库ControlCAN.dll实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注意:

controlCan引用靜態(tài)庫(kù)時(shí)需要將kerneldlls文件夾放置程序的輸出路徑下設(shè)備才能鏈接成功

首先添加外部庫(kù)文件(lib文件)

一.添加第三方的頭文件

這個(gè)問(wèn)題再簡(jiǎn)單不過(guò)了,不過(guò)我還是要說(shuō)下。

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

然后,再將這個(gè)頭文件放到工程的目錄下,就OK了,非常的簡(jiǎn)單

二.添加.lib文件

首先,將.lib文件放到對(duì)應(yīng)的工程目錄下(當(dāng)然,放到其他路徑也可以)。

? ? ? ? ? ?但是,僅僅做這一步是不行的,工程不會(huì)主動(dòng)去包含這個(gè).lib文件,你必須告訴他,lib文件在哪里,才可以。

然后,在QT的工程中,你會(huì)看到一個(gè).pro文件,比如,我的工程名為test_qt,那么我的文件就是test_qt.pro文件,在整?個(gè)QT界面的左上角,.pro文件是管理整個(gè)工程的,當(dāng)要打開一個(gè)工程的時(shí)候,只要打開.pro,就可以打開整個(gè)工?程的所有東西。

? ? ? ? 所以,我們要做的,就是在.pro文件中,加上一句話,告訴工程,.lib在哪里

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

下面對(duì)這句話進(jìn)行解析:

1)+=這個(gè)符號(hào)是連接在一起的,不要自做聰明,給分開了,寫成+ = ,這樣就是錯(cuò)的!

2)+=的左右兩邊可以有空格,也可以沒有空格,隨意的

3)-L之后緊接著就跟著.lib文件所在的目錄,比如,我的目錄是在E盤下的project目錄下的QT目錄下的usbcan_info下,注意,是緊跟著,不要分開,分開就錯(cuò)啦!

4)-l后面跟著的是.lib的文件名,注意,比如你的.lib文件時(shí)ControlCAN.lib,不要傻乎乎的寫成了-lControlCAN.lib,不要帶后綴,要寫成-lControlCAN,同樣,-l后面也沒有空格

完成以上的操作,就可以指定.lib文件了。其實(shí)說(shuō)穿了很簡(jiǎn)單,就是把.lib隨便放到一個(gè)目錄下,然后告訴工程,你的.lib放到哪里了,叫什么名字。

三.添加.dll文件

一個(gè)工程編譯成功后,會(huì)在工程目錄下生成2個(gè)目錄,一個(gè)是debug目錄,一個(gè)是release目錄(注意,如果一個(gè)工程剛剛新建,是沒有這2二個(gè)目錄的,不信的朋友可以看看)。

其中,debug就叫做輸出目錄!因?yàn)楣こ叹幾g后的.exe就在這個(gè)目錄下。

然后,將.dll文件放到這個(gè)目錄下。

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

1.
將ControlCAN.dll和ControlCAN.h拷貝到工程源文件所在的文件夾下

2.
在 工程名.pro 文件內(nèi)加入,如圖所示

LIBS += D:/Qt/CAN_ComPro/debug/ControlCAN.dll
3.
庫(kù)函數(shù)的顯示調(diào)用(以 ?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);
? ? //導(dǎo)入庫(kù)
? ? QLibrary lib("ControlCAN.dll");
? ? if(true==lib.load())
? ? ? ? qDebug()<<"dll load ok";
? ? //從庫(kù)中解析函數(shù)
? ? pOpenDevice = (VCI_OpenDevice *)lib.resolve("VCI_OpenDevice");
? ? //調(diào)用函數(shù)
? ? pOpenDevice(4, 0, 0);
? ? return a.exec();
}
/*******************************

1 連接USB-CAN II設(shè)備
示例代碼如下:

void Ctbox_CarSimulatorDlg::OnBnClickedBtConnect()
{
?? ?// TODO: Add your control notification handler code here
?? ?if(m_connect ==true){?? ?//如果已經(jīng)連接
?? ??? ?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;?? ??? ??? ??? ??? ?//驗(yàn)收碼
?? ?init_config.AccMask=0xffffffff;?? ??? ??? ??? ??? ?//屏蔽碼
?? ?init_config.Filter=1;?? ??? ??? ??? ?//過(guò)濾方式
?? ?init_config.Mode=0;?? ??? ??? ??? ??? ??? ?//模式
?? ?init_config.Timing0=0;?? ??? ??? ??? ?//定時(shí)器0
?? ?init_config.Timing1=0x1c;?? ??? ??? ??? ?//定時(shí)器1
?
?? ?//打開設(shè)備
?? ?if(VCI_OpenDevice(VCI_USBCAN2,0,0)!=STATUS_OK)
?? ?{
?? ??? ?MessageBox("打開設(shè)備失敗!","警告",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;
?? ?}
?? ?//啟動(dòng)CAN
?? ?if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
?? ?{
?? ??? ?MessageBox("啟動(dòng)CAN失敗!","警告",MB_OK|MB_ICONQUESTION);
?? ??? ?VCI_CloseDevice(0,0);
?? ??? ?return;
?? ?}
?? ?m_connect=1;
?? ?GetDlgItem(IDC_BT_CONNECT)->SetWindowText("斷開");
}

注:這里,定時(shí)器0必須設(shè)備為0,定時(shí)器必須設(shè)備為0x1c,在PC上才能正常工作,不然調(diào)用發(fā)送接口時(shí)老是會(huì)返回錯(cuò)誤。

2 發(fā)送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消息一般是通過(guò)個(gè)線程來(lái)實(shí)現(xiàn),如下:

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){
?? ??? ??? ?//注意:如果沒有讀到數(shù)據(jù)則必須調(diào)用此函數(shù)來(lái)讀取出當(dāng)前的錯(cuò)誤碼, ?
? ? ? ? ? ? //千萬(wàn)不能省略這一步(即使你可能不想知道錯(cuò)誤碼是什么) ?
? ? ? ? ? ? VCI_ReadErrInfo(VCI_USBCAN2,0,dlg->m_channel_sel,&errinfo);?
?? ??? ?}
?? ??? ?else{
?? ??? ??? ?//數(shù)據(jù)處理
?? ??? ??? ?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;
}

在對(duì)話框的初始化函數(shù)中啟動(dòng)此接收線程:

AfxBeginThread(ReceiveThread,this);

4 復(fù)位CAN
void Ctbox_CarSimulatorDlg::OnBnClickedBtReset()
{
?? ?// TODO: Add your control notification handler code here
?? ?if(m_connect==0){
?? ??? ?AfxMessageBox("還未連接!",0);
?? ??? ?return;
?? ?}
?? ?//復(fù)位CAN
?? ?if(VCI_ResetCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
?? ?{
?? ??? ?AfxMessageBox("復(fù)位失敗",0);
?? ?}
?? ?//啟動(dòng)CAN
?? ?if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
?? ?{
?? ??? ?MessageBox("啟動(dòng)CAN失敗!","警告",MB_OK|MB_ICONQUESTION);
?? ??? ?VCI_CloseDevice(0,0);
?? ??? ?return;
?? ?}
?? ?AfxMessageBox("復(fù)位成功",0);?? ?
}
?

5 其它
工程中必須包含SDK中提供到lib文件及頭文.

即可VS2010的工程屬性頁(yè)面的Linker->Input->Addtional Dependencies一欄中設(shè)置為:./ControlCAN.lib;%(AdditionalDependencies)

然后將.cpp文件中包含頭文:

#include "ControlCAN.h"
最后需要將USB-CAN II SDK中提供的ControlCAN.dll及kerneldlls文件夾拷貝到工程目錄下,程序才能正常運(yùn)行。

如上示例代碼即可操作USB-CAN II設(shè)備。
參考資料:CAN 接口函數(shù)庫(kù)(二次開發(fā)庫(kù)) - 豆丁網(wǎng)

總結(jié)

以上是生活随笔為你收集整理的Qt调用动态链接库ControlCAN.dll实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。