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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

QT调用Saleae C#生成的dll文件

發布時間:2024/3/26 C# 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。