以后同学们做项目一定会用到QT的三驾马车,QT的三驾马车即QT的串口编程,QT的网络编程和QT的GPIO,今天我们通过一个项目来介绍第一部分,QT的串口编程。
之前看过很多相关的文章,但是按照顺序来编译总是会出错,可是我自己还找不到原因,对于我这种新手小白来说极其不友好,看了网上的一个老师讲的视频,感觉讲的很好,所以今天我来写一篇针对刚开始学习QT的同学实现上位机的一个步骤呀,每个步骤都会有对应的解释,最后有源码,大家可以尝试一块练习一下呀。
现在我们来实现一个具体的串口助手:
一.新建项目
二.设计UI界面
这是设计页面最终的一个效果,非常简单,就是一个控件的布局,大家不要懵,我们一块来做一下。
(1)首先是控件的选择:
最上面是一个接受框: Plain Text edit
左下角是属性(即端口的选择和波特率检验位等): Combo box
属性右边用的是:QLabel
自制串口助手: Group Box 去掉上面的字在里面添加一个QLabel即可
发送框 :Line edit
打开串口, 关闭串口,发送串口,清空: Push Button
(2)对控件进行布局
左下属性:进行一个栅格布局
右下三部分进行一个垂直布局
整体进行一个栅格布局即可
可以适量加入弹簧来使整体界面更加美观一些
(3)对控件进行改名字操作
因为这样方便后续我们在程序中对控件进行操作,也方便别人和自己阅读,起名一定要做到见名知意,而且要简洁。对于一些不用做后续操作的控件,我们不对他们进行命名。
属性的命名如下(QcomoBox):
按钮的命名(QPushButton):
接收框和发送框:
为属性添加值(双击属性框,弹出,点左下角加号):
先为波特率及下面的属性添加值,串口号一会用程序来添加。
三.程序设计
(1)在pro工程文件中:
QT += core gui serialport
(2)在h文件中:
#include<QSerialPort> QSerialPort *serialport;
(3)在cpp文件中:
首先包含一个头文件
然后用QSerialPortInfo::availablePorts()函数搜索可用串口,将串口放入定义的数组中并在ui serialCb显示。(这一步的目的是为串口号属性添加值)
#include<QSerialPortInfo>QStringList serialNamePort; serialport = new QSerialPort(this); foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){ serialNamePort<<info.portName();} ui->serialCb->addItems(serialNamePort);}
(4)为按键添加相应的槽函数
右键按键转到槽,这就是QT的自动关联。
打开按键功能:串口的初始化void Widget::on_openBt_clicked(){ QSerialPort::BaudRate baudRate; QSerialPort::DataBits dataBits; QSerialPort::StopBits stopBits; QSerialPort::Parity checkBits; if(ui->baundrateCb->currentText()=="4800"){ baudRate=QSerialPort::Baud4800; }else if(ui->baundrateCb->currentText()=="9600"){ baudRate=QSerialPort::Baud9600; }else if(ui->baundrateCb->currentText()=="115200"){ baudRate=QSerialPort::Baud115200; } if(ui->dataCb->currentText()=="5"){ dataBits=QSerialPort::Data5; } else if(ui->dataCb->currentText()=="6"){ dataBits=QSerialPort::Data6; }else if(ui->dataCb->currentText()=="7"){ dataBits=QSerialPort::Data7; }else if(ui->dataCb->currentText()=="8"){ dataBits=QSerialPort::Data8; } if(ui->stopCb->currentText()=="1"){ stopBits=QSerialPort::OneStop; } else if(ui->stopCb->currentText()=="1.5"){ stopBits=QSerialPort::OneAndHalfStop; }else if(ui->stopCb->currentText()=="2"){ stopBits=QSerialPort::TwoStop; } if(ui->checkCb->currentText()=="none"){ checkBits=QSerialPort::NoParity; } serialport->setPortName(ui->serialCb->currentText()); serialport->setBaudRate(baudRate); serialport->setDataBits(dataBits); serialport->setStopBits(stopBits); serialport->setParity(checkBits); if(serialport->open(QIODevice::ReadWrite)==true){ QMessageBox::information(this,"提示","成功"); }else{ QMessageBox::critical(this,"提示","失败"); }}
2.关闭串口
void Widget::on_closeBt_clicked(){ serialport->close();}
3.串口收发
接收:
.h文件 槽函数
void serialportReadyRead_Slot();
.cpp文件 关联槽函数
connect(serialport,SIGNAL(readyRead()),this,SLOT(serialportReadyRead_Slot()));
定义槽函数
void Widget::serialportReadyRead_Slot(){ QString buf; buf=QString(serialport->readAll()); ui->recvEdit->appendPlainText(buf); }
发送:
void Widget::on_sendBt_clicked(){ serialport->write(ui->sendEdit->text().toLocal8Bit().data());}
4.清空
void Widget::on_clearBt_clicked(){ ui->recvEdit->clear();}
四.源码
.h文件
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include<QSerialPort>namespace Ui {class Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget(); QSerialPort *serialport;private slots: void on_openBt_clicked(); void on_clearBt_clicked(); void on_closeBt_clicked(); void serialportReadyRead_Slot(); void on_sendBt_clicked();private: Ui::Widget *ui;};#endif // WIDGET_H
.cpp文件
#include "widget.h"#include "ui_widget.h"#include<QSerialPortInfo>#include<QMessageBox>#include<QString>Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); QStringList serialNamePort; serialport = new QSerialPort(this); connect(serialport,SIGNAL(readyRead()),this,SLOT(serialportReadyRead_Slot())); foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){ serialNamePort<<info.portName();} ui->serialCb->addItems(serialNamePort);}Widget::~Widget(){ delete ui;}void Widget::serialportReadyRead_Slot(){ QString buf; buf=QString(serialport->readAll()); ui->recvEdit->appendPlainText(buf);}void Widget::on_openBt_clicked(){ QSerialPort::BaudRate baudRate; QSerialPort::DataBits dataBits; QSerialPort::StopBits stopBits; QSerialPort::Parity checkBits; if(ui->baundrateCb->currentText()=="4800"){ baudRate=QSerialPort::Baud4800; }else if(ui->baundrateCb->currentText()=="9600"){ baudRate=QSerialPort::Baud9600; }else if(ui->baundrateCb->currentText()=="115200"){ baudRate=QSerialPort::Baud115200; } if(ui->dataCb->currentText()=="5"){ dataBits=QSerialPort::Data5; } else if(ui->dataCb->currentText()=="6"){ dataBits=QSerialPort::Data6; }else if(ui->dataCb->currentText()=="7"){ dataBits=QSerialPort::Data7; }else if(ui->dataCb->currentText()=="8"){ dataBits=QSerialPort::Data8; } if(ui->stopCb->currentText()=="1"){ stopBits=QSerialPort::OneStop; } else if(ui->stopCb->currentText()=="1.5"){ stopBits=QSerialPort::OneAndHalfStop; }else if(ui->stopCb->currentText()=="2"){ stopBits=QSerialPort::TwoStop; } if(ui->checkCb->currentText()=="none"){ checkBits=QSerialPort::NoParity; } serialport->setPortName(ui->serialCb->currentText()); serialport->setBaudRate(baudRate); serialport->setDataBits(dataBits); serialport->setStopBits(stopBits); serialport->setParity(checkBits); if(serialport->open(QIODevice::ReadWrite)==true){ QMessageBox::information(this,"提示","成功"); }else{ QMessageBox::critical(this,"提示","失败"); }}void Widget::on_clearBt_clicked(){ ui->recvEdit->clear();}void Widget::on_closeBt_clicked(){ serialport->close();}void Widget::on_sendBt_clicked(){ serialport->write(ui->sendEdit->text().toLocal8Bit().data());}
五.封装程序
这样一个基于QT的串口助手就完成啦,下面我们将它封装起来,以便于他人的使用,因为在以后我们开发软件时,我们不能直接让他人下载QT creator,另一方面,我们的源码也不是可以随便给别人的,所以我们要将做好的程序打包封装,把写好的程序发给用户来用。
下面介绍封装的步骤:
(1)把工程切换到release模式,然后编译。
(2)找到release模式构建的文件夹
(3)改一下图标 可以使用easyicon 网站来找图标 .ico格式
把图标放到工程文件里面去,就是serial下面,和.h.cpp同级。
在pro里面加入这一句话即可。
RC_ICONS=serial.ico
(4)封包操作
需要用到QT的控制台
在电脑桌面上建立一个文件夹,将工程release文件(在建立的文件夹里面)里面的exe 文件拷贝到新建的文件夹下。
在控制台中,用进入命令进入到新建文件夹所在的路径
最后用windeployqt把库加到新建的文件夹下
然后 将exe程序发送到桌面上就可以使用了。
本人的学习还十分浅薄,有不对的地方欢迎大家批评指正,谨以此文来记录一下我的Qt学习之路吧。