0基礎二次開發硬體裝置——一點點進步
提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件
文章目錄
背景
作為一個不會光學設計的光學研究人員,自我感覺啥都幹不了,想實現點什麼東西都要靠別人。現在這個社會,大家一起合作是有未來的。然而身邊的人並不是那麼好合作的時候,就很憋屈。尤其我自身不是特別擅長和別人溝通,即使溝通了,人家做出來後和自己想象的不太一樣,也不好意思再說啥,所以說當領導,有個團隊還是不錯的。當然,我不是領導,有些小事情也不好外協,只能自己幹了。自己只有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提供了大量能使我們快速便捷地處理資料的函式和方法。