封装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_Htypedef void(*CallBackFunc)(char *data, qint64 maxSize);

Qt工程源码:
aardio调用示例:
登录后方可回帖

admin:
请问一下,这个dll导入导出表查看工具在哪里打开?我把aardio IDE的每个按钮都按了一遍也没找到。
谢谢!