封装Qt的串口接口为dll, 并使用aardio调用练习
没用过Qt, 所以下面的内容大部分都来源于网上搜索.
Qt自带了串口通信类 , 参考下面博主分享的代码将Qt自带的串口封装成了dll, 这样其他平台使用起来也方便不少, 当然, 其实串口的相关dll已经有很多很多了, aardio也提供了sio通信库
研究这个纯粹为了学习这个过程,O(∩_∩)O~
Qt封转代码参考:
https://blog.csdn.net/a_1234567890abcd/article/details/52263243
https://github.com/wellfrogliu/Qt
从github里下载源码后, 电脑里装vs2015, 装Qt的msvc库, 然后打开vc工程, 编译生成, 发现有些错误的地方需要修改下,.
这里面的Qt路径是D盘, 但是我安装的时候是c盘, 而且版本也不一样, 所以我偷懒把c盘的qt需要的目录复制到了d盘, 并修改了文件夹名称和这个文件里一样, 哈哈, 懒到极致了.
再次编译生成, 仍然有几处错误, 比如: open函数不在xx类下啊,op()函数不存在啊.等等....
把不存在的添加到对应类里, 反正就是声明了下而已, open那个就直接//注释掉, 再次编译, 一切ok ,
我这里依照博主说的, 生成Release版本dll
下面就是新建个aardio工程进行测试了.
将生成的CommunicationLib.dll 复制到aar工程的res目录里, 主界面代码里raw.loadDll , 然后提示不能打开相应的文件???
好吧, Qt最烦人的其实就在这, Qt里有各种dll相互调用, 那么生成的dll其实也是如此, 不能打开相应的文件, 原因其实就是这个dll找不到内部引用的其他dll , 所以用aardio的dll查看工具看一下
生成的dll里面引用了这么两个qt专用dll , 于是复制这两个dll到res目录里.
再次执行aardio工程, ok了
下面是aardio工程测试代码:
import win.ui; /*DSG{{*/ mainForm = win.form(text="aardio工程3";right=429;bottom=155) mainForm.add( button={cls="button";text="1. init";left=25;top=25;right=137;bottom=65;z=1}; button2={cls="button";text="2. open";left=160;top=25;right=272;bottom=65;z=2}; button3={cls="button";text="3. write";left=160;top=91;right=272;bottom=131;z=3}; button4={cls="button";text="4. callback";left=25;top=91;right=137;bottom=131;z=4}; button5={cls="button";text="5. close";left=296;top=25;right=408;bottom=65;z=5} ) /*}}*/ import console console.open() var dll = ..raw.loadDll("\res\CommunicationLib.dll","commLib","cdecl"); var creat = dll.api("Create","int(int type)" ); var UnInit = dll.api("UnInit","void(void)" ); var Open = dll.api("Open","int(int type,string arg)" ); var Close = dll.api("Close","void(int index)" ); var Write = dll.api("Write","bool(int index, string data, int maxlen)" ); var InstallCallBack = dll.api("InstallCallBack","bool(int index, pointer fun)" ); mainForm.button.oncommand = function(id,event){ var ret = creat(0) console.log(ret) } mainForm.onClose = function(hwnd,message,wParam,lParam){ UnInit(); } var handle; mainForm.button2.oncommand = function(id,event){ //注意第二个参数格式:"com2,9600,8,0,0,0," //PortName,Baud_Rate,Data_Bits,Flow_Control,U_Parity,Stop_Bits handle = Open(0,"com2,9600,8,0,0,0,") console.log(handle) } mainForm.button3.oncommand = function(id,event){ if(handle!=null){ var ret = Write(handle,"abc123",6); console.log(ret) } } //定义静态回调函数 func = function(...){ console.log(...) } //转换为函数指针 func_P = raw.tocdecl(func,"void(string,int)"); mainForm.button4.oncommand = function(id,event){ if(handle!=null){ //静态回调挂接 var ret = InstallCallBack(handle, func_P); console.log(ret) } } mainForm.show(); return win.loopMessage();
我这里在附录下vc的函数声明以供对照:
extern "C" COMMUNICATIONLIB_EXPORT int Create(int type); extern "C" COMMUNICATIONLIB_EXPORT int Open(int type, char* arg); extern "C" COMMUNICATIONLIB_EXPORT void Close(int handle); extern "C" COMMUNICATIONLIB_EXPORT bool Write(int handle, char* data, int maxSize); extern "C" COMMUNICATIONLIB_EXPORT bool InstallCallBack(int handle, void* callback); extern "C" COMMUNICATIONLIB_EXPORT void UnInit(void);
#ifndef COMMTYPE_H #define COMMTYPE_H #include <QString> class Serial_PortType; class CommType { public: enum Comm_Type{ U_SerialPort, U_TCP, U_UDP }; public: CommType(Comm_Type type); ~CommType(); private: public: Comm_Type UseType; /*SerialPort*/ Serial_PortType *U_Serial_Port; }; class Serial_PortType { public: enum DataBits { Data5 = 5,Data6 = 6,Data7 = 7,Data8 = 8}; enum FlowControl { NoFlowControl, HardwareControl, SoftwareControl}; enum Parity { NoParity, EvenParity, OddParity, SpaceParity, MarkParity}; enum StopBits { OneStop, OneAndHalfStop, TwoStop}; QString PortName; int Baud_Rate; DataBits Data_Bits; FlowControl Flow_Control; Parity U_Parity; StopBits Stop_Bits; }; #endif // COMMTYPE_H
typedef void(*CallBackFunc)(char *data, qint64 maxSize);
Qt工程源码:
aardio调用示例:
登录后方可回帖
admin:
请问一下,这个dll导入导出表查看工具在哪里打开?我把aardio IDE的每个按钮都按了一遍也没找到。
谢谢!