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