QT调用Saleae C#生成的dll文件
背景:設(shè)計開發(fā)PEPS的測試設(shè)備時,需要對manchester 等波形采集數(shù)據(jù),實(shí)際使用時常出現(xiàn)波形解析不準(zhǔn)確,設(shè)置參數(shù)多等原因?qū)е聰?shù)據(jù)采集出現(xiàn)問題。所以冒出個想法是否可以直接使用邏輯分析儀輸出的數(shù)據(jù)進(jìn)行分析,這樣就避免了在嵌入式中編寫過多的冗余代碼來實(shí)現(xiàn)各種功能,將數(shù)據(jù)在上位機(jī)中處理。
在查找了各方面的資料后,發(fā)現(xiàn)saleae是支持該方法的使用。
Protocol Analyzer SDK - Saleae Support
該文檔中介紹了該如何使用編譯相關(guān)SDK包 ,example包的使用,下載路徑。內(nèi)容詳細(xì),不多介紹。
下載最新的邏輯分析儀軟件:我使用的是Logic1.2.29.exe 這個版本
Logic 1.x Download - Saleae Support
編譯環(huán)境:VS2015,安裝C#庫
實(shí)操:
下載相關(guān)代碼完成后,首先使用自帶的example進(jìn)行編譯,跑一下例程,熟悉SDK的各個接口
?
1)打開SaleaeSocketApi.sln 編譯,可以直接編譯通過,直接下載的代碼庫沒有任何錯誤。設(shè)置SaleaeSocketApiExample”設(shè)為啟動項目“
2)打開Logic1.2.29.exe 設(shè)置如下 options->Preferences->Developer選項卡。設(shè)置接口為10429,如下圖所示
?
3)運(yùn)行example,在console下直接點(diǎn)擊回車鍵,完成example的運(yùn)行。
?
關(guān)鍵API解讀
在example的代碼中發(fā)現(xiàn)我們比較關(guān)注的API接口主要有如下幾種:
1)Capture():開啟邏輯分析儀觸發(fā)指令,相當(dāng)于點(diǎn)擊start按鈕
2)StopCapture():相當(dāng)于點(diǎn)擊 stop 按鈕
3)void SetCaptureSeconds(double seconds):設(shè)置采集時間
4)void ExportAnalyzers( int selected, String filename, bool mXmitFile ):導(dǎo)出解析出來的數(shù)據(jù)
其中ExportAnalyzers() 函數(shù)使用了較多的參數(shù),并且分析出來的數(shù)據(jù)只能存儲在文件中,并不方便我們使用。對其進(jìn)行簡單改寫,滿足使用要求:
public String ExportAnalyzers_QT() {String filename = System.IO.Directory.GetCurrentDirectory() + "\\xuhy.csv"; //固定文件名,寫入程序目錄下String export_command = export_analyzer_cmd + ", ";export_command += '1' + ", " + filename;export_command += ", mXmitFile";WriteString(export_command); ?String response = "";GetResponse(ref response);return response; //將接收到的字符串返回 }以上4種API可以協(xié)助我們完成利用邏輯分析儀解析出數(shù)據(jù)的功能。
封裝QT使用的dll庫
由于本人并不熟悉C#的代碼編寫,所以還是決定使用C++/QT為基礎(chǔ)完成后續(xù)的相關(guān)代碼編寫。這就需要將C#的API封裝成可供QT使用的庫。
以下內(nèi)容參考該鏈接:Qt程序中調(diào)用C#編寫的dll(推薦) / 張生榮
創(chuàng)建CLR工程,填寫如下代碼,將C#的dll再次打包可供QT使用的dll文件:
#pragma once #include <vcclr.h> #include "stdlib.h" #include "string.h" #include "msclr\marshal_cppstd.h" using namespace msclr::interop; using namespace System; using namespace System::Reflection; using namespace System::Runtime::InteropServices; ? #using "F:\03_study\02_SaleaeSocketApi\CSaleaeSocketApi\CSaleaeSocketApi\CSaleaeSocketApi\SaleaeSocketApi.dll" using namespace SaleaeSocketApi; ? extern "C" __declspec(dllexport) void SetCaptureSeconds(double seconds) {SaleaeSocketApi::SaleaeClient^ obj = gcnew SaleaeClient("127.0.0.1", 10429);return obj->SetCaptureSeconds(seconds); } ? extern "C" __declspec(dllexport) void Capture() {SaleaeSocketApi::SaleaeClient^ obj = gcnew SaleaeClient("127.0.0.1", 10429);obj->Capture(); } ? extern "C" __declspec(dllexport) void StopCapture() {SaleaeSocketApi::SaleaeClient^ obj = gcnew SaleaeClient("127.0.0.1", 10429);obj->StopCapture(); } ? extern "C" __declspec(dllexport) char* ExportAnalyzers(void) {SaleaeSocketApi::SaleaeClient^ obj = gcnew SaleaeClient("127.0.0.1", 10429);String^ get_str = obj->ExportAnalyzers_QT(); ?IntPtr str = Marshal::StringToHGlobalAnsi(get_str);char* strData = reinterpret_cast<char*>(static_cast<void*>(str));return strData; } ? namespace CSaleaeSocketApi { ?public ref class Class1{// TODO: 在此處添加此類的方法。}; }編譯完成后會生成*.dll , *.lib文件,供QT工程使用。
編寫QT工程
該工程直接使用QT example目錄下的assistant進(jìn)行
初始化sdk中api typedef void(*SetCaptureSeconds)(double seconds); typedef void(*Capture)(); typedef char*(*ExportAnalyzers)(); CLR工程與QT工程對應(yīng)關(guān)系如下:?
導(dǎo)入dll庫并使用:
QLibrary library("./CSaleaeSocketApi.dll"); if (library.load()) {SetCaptureSeconds m_SetCaptureSeconds = (SetCaptureSeconds)library.resolve("SetCaptureSeconds");Capture m_Capture = (Capture)library.resolve("Capture");ExportAnalyzers m_ExportAnalyzers = (ExportAnalyzers)library.resolve("ExportAnalyzers"); ?if (m_SetCaptureSeconds){m_SetCaptureSeconds(5);}if (m_Capture){m_Capture();}if (m_ExportAnalyzers){ file_name = m_ExportAnalyzers();qDebug() << file_name;} }library.resolve("API名"):中API名的獲取:使用dumpbin工具:
dumpbin -exports ***.dll
?
演示示例
?
總結(jié)
以上是生活随笔為你收集整理的QT调用Saleae C#生成的dll文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css精灵图的使用步骤
- 下一篇: 电商实训一:电子商务商业模式实训及思考