QT串口助手入门到精通
创建QT项目过程中不能有中文或者空格,可以有下划线,有的话程序不报错,但是窗口显示不出来
创建QT项目的时候都会让你创建一个类,这个类是主窗口的类
第二个窗口是基类,基类有三种选择
三种选择
Qwidget 是QMainWindow和QDialog的父类
类名可以用默认的也可以换成自己想用的
比如我换成myWidget,widget可以理解成窗口的意思
创建界面,选择上,后面就有个设计界面,可以拖出里面的框架
添加到版本信息里面是空的,以后QT开发是团队开发,需要用到版本控制系统(避免团队写的代买冲突),比如git svn vss(用的少)
里面有文件的分类,如果不喜欢文件分类可以点开所框的图形,简化树形图,就消失了文件的分类
可以选择左右分栏和上下分栏,选择后再点下就删掉了,你可以左边写你的代码,后边代码参考别人的源码
QT是个跨平台图形界面引擎
优点:
版本:分为开源版和商业版本
成功案列:
创建第一个QT程序
点击创建项目后,选择项目路径以及给项目起名称
名称–不能有中文不能有空格**
路径–不能有中文路径
默认创建有窗口类,mvWidget,基类有三种选择:QWidget、QMainWindow、aDialogw
main 函数
QApplication a应用程序对象,有且仅有一个
myWidget w;实例化窗口对象
w.show()调用show 函数显示窗口
return a.exec()让应用程序对象进入消息循环机制中,代码阻塞到当前行(避免窗口一闪而过)
END
QT文件以及命名规范和快捷键
上面显示你创建的时间
TARGET(生产目标.exe程序)
点击Explorer中显示后,出现这个目录
上一级目录,里面有build文件,build文件里面有个debug,debug里面有.exe程序
更换TARGET生成的目标文件后会新建一个.exe的程序
想更换你的程序名就从这里修改
主要写的是命名规范
ctrl + alt 点击函数可以跳转到该函数
END
QT串口助手开发文章1
首先需要创建QT程序
创建QT程序的时候,记得点下创建页面,基类选择成Dialog,点击Forms文件夹下面的ui文件便可以绘制ui图形了
在页面绘制一个combo Box,ctrl + r(快捷键)运行
需要学习快捷键用法参考博客
关掉运行的结果,双击下拉框,便可以编辑下拉框了
点击加号按钮就可以给下拉框添加子选项了,添加完点击ok
这种方式不灵活添加完后,只能有你设置的固定选项
代码方式是灵活动态调整Com box(下拉框)
点击下拉框,红框标出的是Objectname就是控件(Combo box就是控件之一)的名字也就是控件的ID,可以更改它的命名为CboxSerialPort(直接编辑值就可以了)
该列表框属于ui的一部分,所以可以更改.cpp文件即通过代码方式来灵活设置下拉框的子选项
CBoxSerialPort是之前设置的Combo box
addItem是增加子选项
出现c++承载,函数名相同,函数的参数不同(在同一个函数名下面实现不同的效果功能),输入不同的参数会调用对应参数的函数
第一个函数的参数Qstring(字符串),把字符串增加进去作为子选项
等于号是默认参数的意思
比如在这里只传一个参数,COM0,后面的参数就默认等于后面函数自带第二个参数的默认值
我们使用第一个函数,ctrl + b 编译然后ctrl + r运行下看效果
运行效果,5678也有了,证明这样的方法是直接增加没有覆盖掉之前的ui方式添加的端口
点击了COM1,怎么知道我点击的是COM1
如:
按钮的响应(push button)
点击右键转到槽,里面有个clicked参数,clicked是个信号,当点击这个按钮的时候,clicked信号发出,对应槽函数响应该信号,从而完成对应的动作,比如关闭对话框
同理combo box
右键点击我们之前创建的combo box 转到槽,选择currentIndexChanged(qstring)(我们用的串口助手,选择不同端口就会修改索引,由于端口是字符串所以选择这个我红框所框的)
点击ok直接切换到dialog.cpp文件中对应的槽函数
参数&argl就是currentIndexChanged所携带的参数就是串口号(字符串)
展示该字符串需要在ui里面加入一个label用来显示我们刚才选择的串口号,并且直接点击label修改为待选,修改其id名
set text设置标签,标签是arg1(串口号),然后编译ctrl +b 运行ctrl +r
点击COM1标签变为COM1,当我们点击COM1的时候,发出信号,这个信号是currentIndexChanged当前索引被修改,并且该信号会携带字符串,这个字符串就是你选择的COM1,从槽传进去,COM1传进去,设置标签显示
点击帮助文档找QSerialPort,就显示QserialPort这个类,里面很多函数,我们只需要设置端口号,所以找set函数,设置端口名,数据位,波特率,校验位,停止位
END
QT串口助手文章2书接上文
根据文章一最后的帮助文档
我们需要给.pro文件添加功能模块和.h文件要加进去头文件才能使用端口功能
加实例,在对话框private私有成员加实例
习惯类内成员以m开头
mSerialPort 是 QSerialPort(类)的实例(对象)
按下F4到.cpp文件中
设置端口号,波特率功能
上面的是界面COM5…9(ui->CBoxSerialPort->addItem(“COM5”)
下面的是端口功能(mSerialPort.setPortName(“COM1”);)
同理设置校验位,数据位,停止位功能
设置打开功能模式只支持读 读写 只读
为了验证你的open函数是否打开
点开设备管理器,串口COM1存在
如果打开成功,QDebug输出串口打开成功!调用了QDebug所以文件要加入#inclue
测试效果
编译ctrl+b运行ctrl+r
测试成功
一切皆文件,物理设备同理,所以串口(设备)也有写的函数
串口的发送功能
可以看到write有三个承载函数,用第一个函数
给串口发送hello world!字符串,测试效果,编译ctrl +b 运行ctrl +r
这个时候需要用到虚拟串口了,建议读者自行下载虚拟串口和串口助手来测试功能
虚拟串口,一个发送数据,一个接受数据
可以看到我们COM1和COM2是一对串口,所以我们在COM1写入的数据,COM2能读取到,用到串口助手调到COM2,COM1发送的hello world,COM2便能读取到
打开串口助手端口号设置成COM2
编译运行我们刚才的程序ctrl+b ctrl + r
可以看到串口助手收到数据hello world
测试成功
END
QT串口助手开发1之绘制界面
首先需要创建QT程序
创建QT程序的时候,记得点下创建页面,基类选择成Dialog
创建好QT程序后,编译ctrl + b ,运行ctrl + r ,弹出窗口
更改窗口名字变成串口调试助手,更改windowTitle即可更改成窗口名字
选中Combo Box 和 Label(标签),复制成5份
Combo Box的用法
绘制页面对齐很花费时间,第一行是水平没对齐,使用快捷方法对齐
选中该行,点击该按钮(水平布局),便可以水平对齐了
这个时候着两个控件就变成一个整体了,可以一个整体的拖动
ctrl + r 运行下看下效果,红色框是提醒水平布局的框,不会出现在运行里面
ctrl + r运行测试下效果
可以拖拉,达到你想要的效果
ctrl + r 运行下效果
需要用到2个push button控件,让其垂直布局,ctrl + r 运行下
这样绘制出来不好看,可以选中这两个控件,ctrl + z 撤销
添加Vertical Spacer(涨位符),撑开一部分空间,这样可以让两个按钮隔开更宽的距离
ctrl + r运行测试下效果
在添加一个Vertical Spacer在按钮和选择框之间,更加美观
ctrl + r 运行下效果
Line Edit行文本框,太小了(只有一行),用Text Edit 或者Plain Edit,我两个都是用的Text Edit
两个Text Edit垂直布局,则会一样大
我们需要一个大一个小(接收界面大,发送界面小)
SizePolicy尺寸策略,两个Text Edit垂直伸展系数都相同
里面更改垂直伸展系统再垂直伸展的时候,就可以实现一大一小的效果了
大概6:1的效果最好看,所以我调制垂直伸展系数为6:1,效果如下
再添加下占位符,更加美观
ctrl + r 运行测试下效果
为了更加美观,再添加一个水平占位符,整体做水平布局,并且鼠标拖拉下达到美观即可
并ctrl + r 运行查看效果,读者觉得不美观也可以自行更改下
END
QT串口助手开发2之串口程序编写
书接上文
绘制好界面后,需要给每个控制命个名,再继续编写串口程序
直接对label直接更改标签名字即可同理pushbutton
设置选项框里面的子选项,设置波特率,串口号用程序的方式动态识别
设置方式见设置选项框的方法
同理校验位,数据位,停止位
点击串口号后面的Combo Box 控件给其ID为cboxSerialPort
同理波特率更名为CboxBaudrate
校验位更名为CboxParity
数据位更名为CboxDataBits
停止位更名为CboxStopBits
pushbutton更名为打开和发送
Text Edit命名为TeditRecv、TeditSend
ctrl + r运行看下效果,如果觉得不是很好看,就在SizePolicy调整策略
自动识别当前系统有效的端口,让你选择(在串口号那栏有子选项可以选择)
去帮助文档查看帮助文档查看方法
首先需要给头文件加功能模块可参考文档
QList列表里的每个成员都是SerialPortInfo,其实这个表就是有效端口的列表
类内的静态成员,可以直接通过类来调用不需要对象,直接调用就是两个::
availablePorts()这个函数返回一个列表到serialportInfo
接下来遍历这个列表,把列表里面的内容填到串口号后面的combo box里面去
帮助文档查看QList(列表或者数组)如何使用当作一个数组访问
在for循环里面,返回一个数组下标,at返回一个串口的信息
最详细写法参考参考写法
ctrl + r运行测试效果
测试成功,再添加2个模拟串口测试
ctrl + r 运行,测试成功
参考文章添加链接描述
右键点击打开按钮转到槽
当打开按钮按下后,其余比如波特率…等等这些就不能在选择子选择,按钮就变成断开按钮类似这样
m开头是类内成员
写个函数,alt + enter 鼠标放在写的函数上,选择添加一个定义,界面就跳转了
这样就可以不用直自己写一个函数
我们要获取5个配置
并且设置进去(转到头文件)
再写其类内的成员
写.cpp文件
默认情况就是115200,你没选择波特率就是115200,以免没设置波特率
同理写其它位
校验位只写三种去除两种,太麻烦了(在ui界面也去掉)
这两种去掉
写.cpp文件
同理其它位
停止位:
写完后要返回open的结果
小灯泡是修改该函数类型后,.h文件也要更改(函数的声明),点下小灯泡跳转到.h文件并且自动帮你更改
.cpp是函数的实现
更变成功
在构造函数中初始化下mIsOpen,默认情况下是关闭
open按钮的槽函数可以响应open单击的动作
点击打开这个按钮后,调用getSerialPortConfig函数,当这个函数返回true说明这个串口打开成功,否则打开失败,这个时候才能设置mIsOpen成员true or false(这个时候才是真正打开串口或者没打开串口)
但是我们打开串口按钮打开后只能选择关闭串口,所以这个是循环的过程,下文再书写如何编写串口程序,该问题留给下文
END
QT串口助手开发3串口开发
根据上文的未解决问题:我们打开串口按钮打开后只能选择关闭串口,所以这个是循环的过程
上文链接
所以按钮对应的槽函数首先必须判断当前串口助手是否打开了助手,closed以后要把按钮的状态恢复成打开,修改mIsOpen标志位为False
否则执行我们写的getSerialPortConfig获取位(数据位…)成功,按钮状态是打开,并且按钮要更新为关闭(并且位的下拉框要变成灰白色不再可以调位下拉框了),如果没有获取成功则按钮状态是关闭的
禁止使用下拉框就成灰白色了
代码如下:
测试下信息,加个QDebug头信息
ctrl + r运行测试效果
我们需要打开按钮打开后才能点击发送按钮
其实还可以直接把mIsopen填进去这样就不用思考填true或者false
ctrl + r 运行测试效果
当你没有打开串口的时候发送按钮是灰色的(不能发送),当你打开串口的时候,发送按钮是可以发送的
发送按钮转到槽函数,详情槽函数可以参考文章槽函数
比如TeditSend函数不会用,就再帮助文档查TeditSend函数,帮助文档使用方法参考文档添加链接描述
由于这个toPlainText()这个函数是Qstring类型,所以我们需要变更下它的函数类型为char*,再帮助文档中查看Qstring函数的用法
Qstring先转换成标准的c++string,然后再用c_str转换成char*
ctrl + r 运行测试下效果
同理写接受框,COM2给COM1发送数据时,这时接收框没有反应
接收框程序写法:
平常都是再ui转到槽函数,这个是从设计界面,如果我们连接到串口,需要用代码的方式连接
connect是连接信号和槽,信号发送者是mSerialPort,发送信号Readyread,发送给槽(先自定义下)的槽
slots槽函数
ALT + ENTER选择添加定义
再写槽函数里面读取串口
当串口有数据的时候,就会发送ReadyRead这个信号,槽函数就会响应,就会读取串口,然后设置到接收文本框里面
ctrl + b编译ctrl + r测试下效果
一直发送都是一个hhh
因为我们之前设置的槽函数,一旦有数据就会读取并且发送到接收框,这样每次发送都是会覆盖掉前面发送的,我们不想要覆盖,所以再点开帮助文档,查看texyedit函数或者直接搜索关键字append,查看到append的槽函数,槽函数依旧是函数可以直接调用
所以把setPlaintext函数变更成append函数即可
ctrl + r 运行测试效果
清除功能,查看帮助文档,搜索clear,可以自行添加