QT调用Saleae C#生成的dll文件
背景:設計開發PEPS的測試設備時,需要對manchester 等波形采集數據,實際使用時常出現波形解析不準確,設置參數多等原因導致數據采集出現問題。所以冒出個想法是否可以直接使用邏輯分析儀輸出的數據進行分析,這樣就避免了在嵌入式中編寫過多的冗余代碼來實現各種功能,將數據在上位機中處理。
在查找了各方面的資料后,發現saleae是支持該方法的使用。
Protocol Analyzer SDK - Saleae Support
該文檔中介紹了該如何使用編譯相關SDK包 ,example包的使用,下載路徑。內容詳細,不多介紹。
下載最新的邏輯分析儀軟件:我使用的是Logic1.2.29.exe 這個版本
Logic 1.x Download - Saleae Support
編譯環境:VS2015,安裝C#庫
實操:
下載相關代碼完成后,首先使用自帶的example進行編譯,跑一下例程,熟悉SDK的各個接口
?
1)打開SaleaeSocketApi.sln 編譯,可以直接編譯通過,直接下載的代碼庫沒有任何錯誤。設置SaleaeSocketApiExample”設為啟動項目“
2)打開Logic1.2.29.exe 設置如下 options->Preferences->Developer選項卡。設置接口為10429,如下圖所示
?
3)運行example,在console下直接點擊回車鍵,完成example的運行。
?
關鍵API解讀
在example的代碼中發現我們比較關注的API接口主要有如下幾種:
1)Capture():開啟邏輯分析儀觸發指令,相當于點擊start按鈕
2)StopCapture():相當于點擊 stop 按鈕
3)void SetCaptureSeconds(double seconds):設置采集時間
4)void ExportAnalyzers( int selected, String filename, bool mXmitFile ):導出解析出來的數據
其中ExportAnalyzers() 函數使用了較多的參數,并且分析出來的數據只能存儲在文件中,并不方便我們使用。對其進行簡單改寫,滿足使用要求:
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可以協助我們完成利用邏輯分析儀解析出數據的功能。
封裝QT使用的dll庫
由于本人并不熟悉C#的代碼編寫,所以還是決定使用C++/QT為基礎完成后續的相關代碼編寫。這就需要將C#的API封裝成可供QT使用的庫。
以下內容參考該鏈接:Qt程序中調用C#編寫的dll(推薦) / 張生榮
創建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進行
初始化sdk中api typedef void(*SetCaptureSeconds)(double seconds); typedef void(*Capture)(); typedef char*(*ExportAnalyzers)(); CLR工程與QT工程對應關系如下:?
導入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
?
演示示例
?
總結
以上是生活随笔為你收集整理的QT调用Saleae C#生成的dll文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css精灵图的使用步骤
- 下一篇: c# char unsigned_dll