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的数据。

相关文章
|
10月前
|
算法 物联网 芯片
基于STM32和51单片机的8位全彩流水灯程序模板
基于STM32和51单片机的8位全彩流水灯程序模板
|
10月前
|
监控 编译器 Windows
Qt5实现Windows平台串口通信
Qt5实现Windows平台串口通信
|
12月前
|
传感器 数据采集 人工智能
基于STM32单片机的智能晾衣架设计与实现【开源免费】
随着智能家居的发展,传统晾衣架已经难以满足现代家庭对便捷、智能化的需求。基于STM32单片机的智能晾衣架能够实现自动升降、光照检测、风干控制、远程控制等功能,为家庭用户提供更智能、更舒适的晾晒体验。本项目以STM32F103C8T6为核心控制器,通过电机驱动模块、光照传感器、温湿度传感器、蓝牙/Wi-Fi通信模块,实现晾衣架的自动化与远程控制。
基于STM32单片机的智能晾衣架设计与实现【开源免费】
|
12月前
|
存储 编解码 开发者
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
小恐龙游戏最初是作为浏览器离线小游戏而广为人知,其简单的操作与生动的画面使其深受用户喜爱。本项目将经典的小恐龙跳跃游戏移植到嵌入式平台上,使用STM32微控制器作为核心控制器,OLED屏幕进行显示,搭配按键或触摸实现用户交互。通过本项目,既可以体验游戏开发在嵌入式系统上的实现方式,又能掌握STM32 GPIO、定时器、OLED驱动、按键扫描及简单动画实现技术。
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
|
12月前
|
传感器 数据采集 物联网
基于STM32和FreeRTOS的智能手环项目设计与实现【免费开源】
随着可穿戴设备的普及,智能手环逐渐成为健康管理、运动监测和生活便捷的重要工具。本项目旨在设计一款基于STM32微控制器和FreeRTOS实时操作系统的智能手环,具备心率监测、运动计步、睡眠分析以及蓝牙通信功能。通过FreeRTOS实现多任务调度,提高系统响应效率和资源利用率,同时保证低功耗设计,延长手环续航。
基于STM32和FreeRTOS的智能手环项目设计与实现【免费开源】
|
12月前
|
传感器 机器人 物联网
【免费开源】基于STM32的蓝牙小车/智能小车项目详解(附源码)
通过本项目,你可以系统掌握STM32外设控制、蓝牙通信、电机驱动和传感器数据处理技术,实现一辆可远程控制并具备避障功能的智能小车。该项目具有高度可扩展性,后续可增加循迹、自动寻路、摄像头等高级功能。
3189 43
【免费开源】基于STM32的蓝牙小车/智能小车项目详解(附源码)
|
12月前
|
传感器 数据采集 算法
【免费开源】基于 STM32F4 的四轴飞行器设计与实现——从零开始到成功起飞(项目源码打包分享)
四轴飞行器作为一种低空、低成本的遥感平台,已经在多个领域展现出广泛的应用潜力。相比其他类型的飞行器,它在硬件上结构紧凑、安装方便,但在软件层面却充满挑战——从传感器数据融合到姿态解算,再到快速且稳定的控制算法,每一环节都需要精心设计,也正因此让四轴飞行器更具技术魅力。
1255 74
|
芯片 内存技术
STM32 Customer BootLoader 刷新项目 (二) 方案介绍
本项目设计了一款基于STM32的二级BootLoader,旨在为客户自定义启动过程提供软件更新和操作后门。BootLoader架构分为三层:ST自带Boot(SB)、客户定制化Boot(CB)和应用层(APP)。CB通过USART与MCU通信,支持多种指令如版本查询、擦除扇区、写入数据等,实现灵活的软件管理和更新功能。Flash空间分配为Sector 0-1用于CB,Sector 2-11用于APP。整个方案详细介绍了内存布局、跳转逻辑及支持的指令集,确保系统稳定运行并支持未来的扩展需求。
 STM32 Customer BootLoader 刷新项目 (二) 方案介绍
|
存储 安全 数据安全/隐私保护
STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建
本文介绍了基于STM32的Customer BootLoader刷新项目的第一部分:使用STM32CubeMX搭建UART串口通信工程。项目采用正点原子探索者v2开发板,通过USB串口与上位机通信,实现固件刷新功能。主要内容包括: 1. 硬件原理图介绍:详细描述了开发板的串口连接方式及电路图。 2. STM32CubeMX工程搭建:从创建新工程、配置系统时钟、USART串口设置到生成代码,一步步详细说明。 3. 代码编写:展示了如何使用HAL库实现串口接收和发送数据,并提供了main.c的完整代码。 4. 工程下载和调试:编译并下载工程到开发板,通过串口调试助手验证通信功能。
STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建
|
存储 文件存储 数据库
【QT项目】QT项目综合练习之简易计数器(QT6+文件存储)
【QT项目】QT项目综合练习之简易计数器(QT6+文件存储)
450 2

推荐镜像

更多
  • qt