当前位置:首页 » 《关注互联网》 » 正文

QT三驾马车(一)——实现上位机(串口数据发送和接收)

19 人参与  2024年04月03日 18:25  分类 : 《关注互联网》  评论

点击全文阅读


以后同学们做项目一定会用到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学习之路吧。


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/90267.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1