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提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值