封装Qt的串口接口为dll, 并使用aardio调用练习

By admin at 20 天前 • 0人收藏 • 190人看过

没用过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工程, 编译生成, 发现有些错误的地方需要修改下,.

image.png

这里面的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查看工具看一下

image.png

生成的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);

image.png


Qt工程源码:

CommunicationLib.zip

aardio调用示例:

aardio工程3.zip


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...