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

By admin at 2020-06-14 • 2人收藏 • 3533人看过

没用过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


3 个回复 | 最后更新于 2022-06-05
2021-04-30   #1

admin:


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


谢谢!

2021-04-30   #2

回复#1 @henry1 :

右侧[工具]->[探测器]->dll查看工具

image.png

2022-06-19   #3

tks

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...