QT上位机串口+STM32单片机项目(二)

简介: QT上位机串口+STM32单片机项目

3.QT完整代码

我的文件是这样的

1.shangwei.pro

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
    form.cpp \
    main.cpp \
    mainwindow.cpp
HEADERS += \
    form.h \
    mainwindow.h
FORMS += \
    form.ui \
    mainwindow.ui
#串口通信
QT       +=serialport
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
RESOURCES += \
    rec.qrc

2.form.h

#ifndef FORM_H
#define FORM_H
#include <QWidget>
#include <QtSerialPort/QSerialPort>         // 提供访问串口的功能
#include <QtSerialPort/QSerialPortInfo>     // 提供系统中存在的串口信息
namespace Ui {
class Form;
}
class Form : public QWidget
{
    Q_OBJECT
public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();
private slots:
    void on_pushButton_clicked();
    void on_pushButton_9_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
    void on_pushButton_4_clicked();
    void on_pushButton_5_clicked();
    void on_pushButton_6_clicked();
    void on_pushButton_7_clicked();
    void on_pushButton_8_clicked();
    void on_pushButton_10_clicked();
    void on_pushButton_13_clicked();
    void on_pushButton_14_clicked();
    void on_pushButton_11_clicked();
    void on_pushButton_12_clicked();
    void on_pushButton_16_clicked();
    void on_pushButton_15_clicked();
    void on_pushButton_19_clicked();
    void on_pushButton_20_clicked();
    void on_pushButton_21_clicked();
    void on_pushButton_22_clicked();
private:
    Ui::Form *ui;
    QSerialPort     *serial;              //定义全局的串口对象
    void configSetEnable1(bool b1);
};
#endif // FORM_H

3.mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//串口通信
#include "form.h"
#include <QtSerialPort/QSerialPort>         // 提供访问串口的功能
#include <QtSerialPort/QSerialPortInfo>     // 提供系统中存在的串口信息
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
    void on_pushButton_4_clicked();
    void on_pushButton_5_clicked();
private:
    Ui::MainWindow *ui;
    void SerialPortInit(void);
    void initConfig();
    void serial_readyRead();
    void configSetEnable(bool b);
    //串口变量↓
    QSerialPort     *serial;              //定义全局的串口对象
    QStringList     baudList;             //波特率
    QStringList     parityList;           //校验位
    QStringList     dataBitsList;         //数据位
    QStringList     stopBitsList;         //停止位
    QStringList     flowControlList;      //控制流
    bool isSerialOpen;
    Form *form;
};
#endif // MAINWINDOW_H

4.form.cpp

#include "form.h"
#include "ui_form.h"
#include <QDebug>
#include "mainwindow.h"
#include "QLabel"
#include "QMovie"
Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
     configSetEnable1(false);
     QMovie *movie = new QMovie(":/new/prefix1/image/83686B74CD2AF08B32BC013618CD188F.gif");
     ui->label->setMovie(movie);
     movie->start();
     connect(ui->pushButton_17,&QPushButton::clicked,this,[=](){
         movie->stop();
     });
     connect(ui->pushButton_18,&QPushButton::clicked,this,[=](){
         movie->start();
     });
}
Form::~Form()
{
    delete ui;
}
void Form::on_pushButton_clicked()   //点亮LED1
{
            QByteArray data ="11";
            serial->write(data);
            qDebug() <<serial ;
}
void Form::on_pushButton_9_clicked()
{
    serial->close();
    MainWindow *w=new MainWindow;
    w->show();
    this->close();
}
void Form::on_pushButton_2_clicked()   //熄灭LED1
{
    QByteArray data ="12";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_3_clicked()  //点亮LED2
{
    QByteArray data ="21";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_4_clicked()  //熄灭LED2
{
    QByteArray data ="22";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_5_clicked()  //点亮LED3
{
    QByteArray data ="31";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_6_clicked()  //熄灭LED3
{
    QByteArray data ="32";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_7_clicked()  //点亮LED4
{
    QByteArray data ="41";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_8_clicked()  //熄灭LED4
{
    QByteArray data ="42";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_10_clicked()
{
    if(ui->pushButton_10->text() == QString("打开串口")) {
        //串口配置
        //清空缓冲区
        serial = new QSerialPort;                       //申请内存,并设置父对象
        // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件
        //QSerialPortInfo::availablePorts()的返回值为QList<QSerialPortInfo> 每一个可用端口组成的容器
        foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
        {
            serial->setPort(info);
            if(serial->open(QIODevice::ReadWrite))      // 以读写方式打开串口
            {
                                    // 在对象中设置串口
                qDebug() << "串口打开成功";
                serial->close();                        // 关闭
            } else
            {
                qDebug() << "串口打开失败,请重试";
            }
        }
        // 参数配置,波特率V
        serial->setBaudRate(QSerialPort::Baud115200);
        // 校验位,校验默认选择无
        serial->setParity(QSerialPort::NoParity);
        // 数据位,数据位默认选择8位
        serial->setDataBits(QSerialPort::Data8);
        // 停止位,停止位默认选择1位
        serial->setStopBits(QSerialPort::OneStop);
        // 控制流,默认选择无
        serial->setFlowControl(QSerialPort::NoFlowControl);
        //改变按钮上的文本
        ui->pushButton_10->setText("关闭串口");
        //输出通道的端口名字
        bool isSerialOpen = serial->open(QIODevice::ReadWrite);
        serial->setDataTerminalReady(true);
        serial->setReadBufferSize(3);
        if (!isSerialOpen) {
             qDebug()<< QString("Failed to open serial port:")  << serial->errorString();
             serial->clearError();
              configSetEnable1(false);
          }else {
                qDebug()<< QString("The serial port is open: ") ;
                configSetEnable1(true);
          }
   }else{
          configSetEnable1(false);
         ui->pushButton_10->setText("打开串口");
         serial->close();
    }
}
void Form::on_pushButton_13_clicked()
{
    QByteArray data ="55";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_14_clicked()
{
    QByteArray data ="66";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_11_clicked()
{
    QByteArray data ="77";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_12_clicked()
{
    QByteArray data ="88";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_16_clicked()
{
    QByteArray data ="99";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_15_clicked()
{
    QByteArray data ="98";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::configSetEnable1(bool b1)
{
    ui->pushButton->setEnabled(b1);
    ui->pushButton_2->setEnabled(b1);
    ui->pushButton_3->setEnabled(b1);
    ui->pushButton_4->setEnabled(b1);
    ui->pushButton_5->setEnabled(b1);
    ui->pushButton_6->setEnabled(b1);
    ui->pushButton_7->setEnabled(b1);
    ui->pushButton_8->setEnabled(b1);
    ui->pushButton_11->setEnabled(b1);
    ui->pushButton_12->setEnabled(b1);
    ui->pushButton_13->setEnabled(b1);
    ui->pushButton_14->setEnabled(b1);
    ui->pushButton_16->setEnabled(b1);
    ui->pushButton_15->setEnabled(b1);
    ui->pushButton_19->setEnabled(b1);
    ui->pushButton_20->setEnabled(b1);
    ui->pushButton_21->setEnabled(b1);
    ui->pushButton_22->setEnabled(b1);
   // ui->pushButton_9->setEnabled(b1);
}
void Form::on_pushButton_19_clicked()   //启动蜂鸣器
{
    QByteArray data ="14";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_20_clicked()   //关闭蜂鸣器
{
    QByteArray data ="15";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_21_clicked()
{
    QByteArray data ="13";
    serial->write(data);
    qDebug() <<serial ;
}
void Form::on_pushButton_22_clicked()
{
    QByteArray data ="16";
    serial->write(data);
    qDebug() <<serial ;
}

5.main.cpp

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

6.mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
//串口通信
#include <QDebug>
#include <QString>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initConfig();
    form=new Form;
    QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::serial_readyRead);
    //固定大小
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::SerialPortInit()
{
    serial = new QSerialPort;                       //申请内存,并设置父对象
    // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件
    //QSerialPortInfo::availablePorts()的返回值为QList<QSerialPortInfo> 每一个可用端口组成的容器
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        serial->setPort(info);
        if(serial->open(QIODevice::ReadWrite))      // 以读写方式打开串口
        {
                                // 在对象中设置串口
            qDebug() << "串口打开成功";
            serial->close();                        // 关闭
        } else
        {
            qDebug() << "串口打开失败,请重试";
        }
    }
    // 参数配置,波特率V
    serial->setBaudRate(QSerialPort::Baud19200);
    // 校验位,校验默认选择无
    serial->setParity(QSerialPort::NoParity);
    // 数据位,数据位默认选择8位
    serial->setDataBits(QSerialPort::Data8);
    // 停止位,停止位默认选择1位
    serial->setStopBits(QSerialPort::OneStop);
    // 控制流,默认选择无
    serial->setFlowControl(QSerialPort::NoFlowControl);
}
void MainWindow::on_pushButton_clicked()
{
   form->show();
   serial->close();
   this->close();
}
void MainWindow::on_pushButton_2_clicked()  //清除  接收
{
    //清除显示
        ui->textEdit->clear();
}
void MainWindow::on_pushButton_3_clicked() //发送
{
    if(ui->pushButton_5->text() == QString("CLOSE")) {
            QByteArray data = ui->textEdit_2->toPlainText().toUtf8();
            serial->write(data);
            qDebug() <<serial ;
    }else{
        ui->textEdit->append("请打开串口!!!!!");
    }
}
void MainWindow::on_pushButton_4_clicked() //清除发送
{
    //清除显示
    ui->textEdit_2->clear();
}
void MainWindow::on_pushButton_5_clicked()  //打开,关闭
   {    //是OPEN时,代表没有打开串口
        if(ui->pushButton_5->text() == QString("OPEN")) {
            //检查串口是否被占用,再次检查一遍
            //串口配置
            //清空缓冲区
            serial = new QSerialPort;                       //申请内存,并设置父对象
            // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件
            //QSerialPortInfo::availablePorts()的返回值为QList<QSerialPortInfo> 每一个可用端口组成的容器
            foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
            {
                serial->setPort(info);
                if(serial->open(QIODevice::ReadWrite))      // 以读写方式打开串口
                {
                                        // 在对象中设置串口
                    qDebug() << "串口打开成功";
                    serial->close();                        // 关闭
                } else
                {
                    qDebug() << "串口打开失败,请重试";
                }
            }
            //设置波特率
            serial->setBaudRate( static_cast<QSerialPort::BaudRate> (ui->comboBox_2->currentText().toInt()) );
            //设置停止位
            serial->setStopBits( static_cast<QSerialPort::StopBits> (ui->comboBox_3->currentText().toInt()));
            //设置数据位
            serial->setDataBits( static_cast<QSerialPort::DataBits> (ui->comboBox_6->currentText().toInt()) );
            //设置校验
            serial->setParity  ( static_cast<QSerialPort::Parity>   (ui->comboBox_4->currentIndex()));
            //设置流控
            serial->setFlowControl(QSerialPort::NoFlowControl);
            //改变按钮上的文本
            ui->pushButton_5->setText("CLOSE");
            //输出通道的端口名字
            ui->lineEdit->setText(serial->portName());
            isSerialOpen = serial->open(QIODevice::ReadWrite);
            serial->setDataTerminalReady(true);
            serial->setReadBufferSize(3);
            if (!isSerialOpen) {
                 qDebug()<< QString("Failed to open serial port:")  << serial->errorString();
                 serial->clearError();
              }else {
                    qDebug()<< QString("The serial port is open: ") ;
              }
       }else{
             ui->pushButton_5->setText("OPEN");
             serial->close();
        }
}
void MainWindow::initConfig() {
//        //创建对象,并建立信号槽
        serial = new QSerialPort(this);
//        //读函数的信号槽
        QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::serial_readyRead);
        //添加波特率
        QStringList baudList;
        baudList << "115200" << "57600" << "9600" ;
        ui->comboBox_2->addItems(baudList);
        ui->comboBox_2->setCurrentText("115200");
        //添加停止位
        QStringList baudList1;
        baudList1 << "0.5" << "1" << "1.5"<<"2" ;
        ui->comboBox_3->addItems(baudList1);
        ui->comboBox_3->setCurrentText("1");
        //添加数据位
        QStringList baudList2;
        baudList2 << "8" << "9"  ;
        ui->comboBox_6->addItems(baudList2);
        ui->comboBox_6->setCurrentText("8");
        //奇偶校验
        QStringList baudList3;
        baudList3 << "NO" << "EVEN"  ;
        ui->comboBox_4->addItems(baudList3);
        ui->comboBox_4->setCurrentText("NO");
}
void MainWindow::serial_readyRead()
{
       //从接收缓冲区中读取数据
        QByteArray buffer = serial->readAll();
        //从界面中读取以前收到的数据
        QString recv = ui->textEdit->toPlainText();
        recv += QString(buffer);
        //清空以前的显示
        ui->textEdit->clear();
        //重新显示
        ui->textEdit->append(recv);
         qDebug() <<recv<<"cxc" ;
}
void MainWindow::configSetEnable(bool b)
{
//    ui->comboBox_2->setEnabled(b);
//    ui->comboBox_3->setEnabled(b);
//    ui->comboBox_6->setEnabled(b);
//    ui->comboBox_4->setEnabled(b);
//    //
//    ui->pushButton_3->setEnabled(!b);
}

4.STM32完整代码

代码太多,后面会打包成压缩文件。

文件包

5.实现效果

实现效果就是和按钮名字相同,电脑点击播放音乐单片机会播放音乐,点击点亮LED1,LED1会点亮。点击刷新数据,LCD会显示收集的温湿度数据和MQ135数据,以及MQ2的数据。

相关文章
|
4月前
|
网络协议 容器
【qt】 TCP编程小项目
【qt】 TCP编程小项目
82 0
|
1月前
|
存储 文件存储 数据库
【QT项目】QT项目综合练习之简易计数器(QT6+文件存储)
【QT项目】QT项目综合练习之简易计数器(QT6+文件存储)
|
1月前
|
XML 数据可视化 C语言
001 Qt_从零开始创建项目
本文是Qt专栏的第一篇,介绍了如何创建一个Qt项目。
89 4
|
5月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
798 0
|
2月前
|
传感器 监控 JavaScript
千套单片机\stm32毕设课设题目及资料案列-干货分享
为帮助电子工程领域的学习者顺利毕业或掌握更多专业知识,我们精心整理了一系列单片机和STM32相关的题目及资料案例。这些资源覆盖了从毕业设计到课程设计的各个方面,包括但不限于智能小车、温度控制系统、无线通信、智能家居等多个领域。每项设计都配有详细的原理图、仿真图以及完整的文档资料,旨在帮助学生深入理解理论知识的同时,提高实际动手操作能力。无论是初学者还是有一定基础的学生,都能从中找到适合自己的项目进行实践探索。
299 8
|
2月前
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
|
4月前
【qt】平面CAD(计算机辅助设计 )项目 上
【qt】平面CAD(计算机辅助设计 )项目 上
53 0
|
4月前
【qt】项目移植
【qt】项目移植
39 0
【qt】项目移植
|
4月前
【Qt项目专栏】贪吃蛇小游戏1.0
【Qt项目专栏】贪吃蛇小游戏1.0
109 5