首页 > 技术文章 > Qt 新手实战项目之手把手打造一个串口助手

lvvou 2021-07-05 22:35 原文

一前景

很多时候我们在学习一门新的语言,一直在学习各种语法和记住各种关键字,很容易产生枯燥的情绪,感觉学习这些玩意儿不知道用在什么地方,心里很是苦恼,这不,我在这记录下我学习Qt的第一个的小项目-串口通讯助手吧,边做项目边学习比单独看知识点可有趣多啦。话不多说,我们就现在开始吧!

二准备工作

我这边使用的Qt版本为5.12.8,然后打开qt creator。

1,新建项目,选择Qt Widgets Application
在这里插入图片描述

2,填写名称和创建路径
在这里插入图片描述
3.之后一直默认点下一步。

4.完成后项目是以下这样的,我的项目名称为:MySerialport
!!d
这样我们的准备工作就完成了!

三编写代码

1,我们双击打开:MySerialport.pro 文件
在这里插入图片描述
在这添加 Qt += serialport,然后点击ctrl+s保存
在这里插入图片描述
执行qmake一下,重新构建
在这里插入图片描述
2,添加头文件
在这里插入图片描述
3.好了,准备工作已经做好了,接下来我们先设计ui界面
在这里插入图片描述
接下来出现ui设计界面
在这里插入图片描述
设计完成后
在这里插入图片描述
现在开始到了关键的时候,我们开始写代码
这是头文件:mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void _Init();

private:
    void _onOpen();
    void _onClose();
    void _onSendData();
    void _onSerialDatas();

private:
    Ui::MainWindow *ui;
    QSerialPort *_serial;

};
#endif // MAINWINDOW_H

这是源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , _serial(nullptr)
{
    ui->setupUi(this);
    _Init();
}

MainWindow::~MainWindow()
{
    delete ui;
    _onClose();
}

/*初始化一些必要环境*/
void MainWindow::_Init()
{
    connect(ui->toolButton_open,  &QToolButton::clicked, this, &MainWindow::_onOpen);
    connect(ui->toolButton_close, &QToolButton::clicked, this, &MainWindow::_onClose);
    connect(ui->toolButton_send,  &QToolButton::clicked, this, &MainWindow::_onSendData);
}

/*打开串口*/
void MainWindow::_onOpen()
{
    _serial = new QSerialPort();

    /*选择信息*/
    const QString portname = ui->comboBox_com->currentText();
    const QString baudRate = ui->comboBox_baudrate->currentText();
    const QString data     = ui->comboBox_data->currentText();
    const QString stop     = ui->comboBox_stop->currentText();
    const QString polarity = ui->comboBox_polarity->currentText();

    /*设置串口名*/
    _serial->setPortName(portname);

    /*波特率*/
    if(baudRate == "9600"){
        _serial->setBaudRate(QSerialPort::Baud9600);
    }
    else if(baudRate == "38400"){
        _serial->setBaudRate(QSerialPort::Baud38400);
    }

    /*数据位*/
    if(data == "5"){
        _serial->setDataBits(QSerialPort::Data5);
    }
    else if(data == "6"){
        _serial->setDataBits(QSerialPort::Data6);
    }
    else if(data == "7"){
        _serial->setDataBits(QSerialPort::Data7);
    }
    else if(data == "8"){
        _serial->setDataBits(QSerialPort::Data8);
    }

    /*停止位*/
    if(stop == "1"){
        _serial->setStopBits(QSerialPort::OneStop);
    }
    else if(stop == "1.5"){
        _serial->setStopBits(QSerialPort::OneAndHalfStop);
    }
    else if(stop == "2"){
        _serial->setStopBits(QSerialPort::OneStop);
    }

    /*校验位*/
    if(polarity == "无"){
        _serial->setParity(QSerialPort::NoParity);
    }
    else if(polarity == "奇校验"){
        _serial->setParity(QSerialPort::EvenParity);
    }
    else if(polarity == "偶校验"){
        _serial->setParity(QSerialPort::OddParity);
    }

    /*开始打开串口*/
    if(!_serial->open(QIODevice::ReadWrite)){
        QMessageBox::warning(this, "警告", "串口打开失败!");
        return;
    }

    ui->toolButton_open->setEnabled(false);
    connect(_serial, &QSerialPort::readyRead, this, &MainWindow::_onSerialDatas);
}

/*关闭串口*/
void MainWindow::_onClose()
{
    if(_serial != nullptr){
        _serial->close();
        delete _serial;
        _serial = nullptr;
        ui->toolButton_open->setEnabled(true);
    }

}

/*发送串口数据*/
void MainWindow::_onSendData()
{
    if(_serial != nullptr){
        QByteArray datas = ui->lineEdit_send->text().toLocal8Bit();
        _serial->write(datas);
        _serial->waitForBytesWritten(3000);
    }
}

/*接收串口数据*/
void MainWindow::_onSerialDatas()
{
    QString datas = _serial->readAll();
    ui->textEdit_rece->append(datas.toLatin1());
}


编译运行一下,我们的代码串口助手已经编写完成了,接下来就是测试一下我们编写的是否正确!
在这里插入图片描述

三测试

运行我们刚刚写好的串口助手,接下来,再打开另外一个已经测试好的串口通信助手,如果它们两个串口通信助手都能发送和接收数据,说明我们编写的串口通信助手是没有问题的。

1.先测试发送功能
在这里插入图片描述
由上图看,我们刚编写的串口通信助手发送功能没有问题!

2.再测试接收功能
在这里插入图片描述
由上图看,我们刚编写的串口通信助手接收功能没有问题!

四结束

以上就是记录学习Qt过程中,第一次做一个小小项目的体验,虽然看上去没多大功能,但当时还是很有成就感的!

学无止境,好好努力,致自己,致未来!

推荐阅读