1. 程式人生 > 其它 >0基礎二次開發硬體裝置——一點點進步

0基礎二次開發硬體裝置——一點點進步

技術標籤:筆記matlabdll

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件

文章目錄


背景

作為一個不會光學設計的光學研究人員,自我感覺啥都幹不了,想實現點什麼東西都要靠別人。現在這個社會,大家一起合作是有未來的。然而身邊的人並不是那麼好合作的時候,就很憋屈。尤其我自身不是特別擅長和別人溝通,即使溝通了,人家做出來後和自己想象的不太一樣,也不好意思再說啥,所以說當領導,有個團隊還是不錯的。當然,我不是領導,有些小事情也不好外協,只能自己幹了。自己只有matlab基礎,實現影象處理和一些相機的控制還是可以的,但有些裝置不提供matlab介面,只能乾瞪眼了。

以上就是今天要總結內容的一個背景——想做點自己想做的事,被逼無奈


提示:以下是本篇文章正文內容,下面案例可供參考

一、如何實現裝置的控制?

有兩種方法:

(1)重新回爐,學習C/C++語言;

(2)matlab呼叫動態連結庫。

兩種方法我都努力了,第一種完全自學太費時間,門檻也挺高(至少對我來說),下載了VSCode(聽說安裝比較小),結果發現環境配置就搞不定,果斷放棄。然後回到vs(之前也是配置搞不定,安裝檔案也很大,放棄了好幾次),下載了vs2019,查了網上的基礎教程,發現竟然不用那麼複雜的配置了,連環境變數都沒有自己配,感覺友好多了,還有很多初級的模板,比如hello world輸出。然後根據教程,重現了加法功能、輸出列印功能,下載了Qt5,實現了加法介面,用MFC實現了劃線功能。這些跟著教程做,問題都不大。但是回過頭去看人家為什麼那樣做,因為沒有面向物件程式設計的基礎,一頭霧水,想要自己實現別的功能一點頭緒都沒有。連呼叫dll都不知道咋整,然後就想起來裝置sdk裡還有個demo,開啟相應的*.sln檔案學習一下,連上光譜裝置debug後發現通過了,心裡一激動,再努力一下。然後瞭解了指標變數(並不理解,只知道形式),瞭解瞭如何輸出,略微修改了一下,可以在黑框裡把光譜打印出來,還是有點小激動,起碼用demo程式後面還是有可能自己實現個介面的,但是Qt還需要更多的時間學習,就先擱置了。

其實這一次最開始我嘗試的是第二種方法,但是每次呼叫都出問題,有點灰心了。嘗試了第一種方式,覺得需要時間比較多,最終還是回到了第二種方式。一是這種方式一旦成功了,實現起來比較快;二是前面的摸索,對sdk中的一些函式有了新的理解,再嘗試一下也許能夠成功。於是就開始了以下的嘗試:

二、matlab呼叫dll過程

1.前期準備

matlab編譯環境肯定要準備好,需要安裝MinGW-w64

可以輸入mex -setup檢查是否已經安裝。

>> mex -setup
MEX 配置為使用 'MinGW64 Compiler (C)' 以進行 C 語言編譯。
警告: MATLAB C 和 Fortran API 已更改,現可支援
  包含 2^32-1 個以上元素的 MATLAB 變數。您需要
  更新程式碼以利用新的 API。
  您可以在以下網址找到更多的相關資訊:
  https://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。

要選擇不同的語言,請從以下選項中選擇一種命令:
mex -setup C++
mex -setup FORTRAN

2.dll呼叫

所需函式:loadlibrary()、libpointer()、calllib()、libfunction()

具體用法可以參考help,需要說明的是,dll檔案和h檔案的檔名可以不一致,但是需要是關聯的,就是在生成dll檔案時產生的。

如生成了test.dll、test.lib、testall.h三個檔案,把這三個檔案放在一起。

先載入dll,如果m檔案沒有和這三個檔案在一起,需要前面加完整路徑。

loadlibrary('test.dll','testall.h')

如果載入成功,則動態連結庫已經寫入了,這時候就可以呼叫裡面的函式,可以檢視可用函式及輸入輸出情況。如果失敗,比如提示庫是x86編譯的,和x64系統不匹配,需要編譯成x64的。如果是別的錯誤,就檢查一下h檔案裡是不是有

extern "C" ,沒有這個matlab認不出來。

libfunction('test.dll','-full')

這時候會列出動態連結庫中能用的函式及輸入輸出參量的格式要求。我遇到的問題就集中在這裡,由於C++裡的參量使用規則和matlab裡差別很大,所以很不適應,主要是指標變數。查了很多教程都沒有涉及到這個問題,因此這裡記錄一下。

主要還是因為在學習VS2019的時候想到的,因為demo裡有各個函式的使用例程,所以在matlab裡也照著試試,就利用libpointer()函式把已經賦值的變數轉換為指標變數

b=libpointer('doublePtr',a);

這時候b就可以作為指標變數傳遞到dll中的函式裡了,doublePtr根據要求可以改成別的。要注意,a在賦值的時候一定要滿足函式對引數的要求,比如要求引數是一個長度100的向量,那麼a一定要是個長度100的向量。我的理解是為了給函式內部某個變數指定記憶體起始位置。

然後就成功獲取了我心心念唸的光譜資料!如此我就可以用matlab控制光譜儀了,當然後面有時間我還是要把Qt介面搞定,這樣還是比較好的,畢竟matlab想要跨平臺還需要帶個runtime,而且啟動賊慢,只適合自己玩。


總結

想要從0開始搞程式碼的事,還是需要有踏踏實實的時間來一點點鑽研,要麼認認真真從頭開始學,要麼就一步一步解決問題。

提示:這裡對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理資料的函式和方法。