当前位置:   article > 正文

QT上位机串口+STM32单片机项目_qt stm32

qt stm32

第一个自己的上位机小项目,嘿嘿,还是有些成绩感的。

目录

1.先看QT上位机部分

1.首先写一个页面

2.mainwindow.cpp主要函数。

2.form.cpp主要函数

3.STM32部分

1.main函数

3.QT完整代码

1.shangwei.pro

2.form.h

3.mainwindow.h

4.form.cpp

5.main.cpp

6.mainwindow.cpp


 

1.先看QT上位机部分

1.首先写一个页面

 点击隐藏BOSS后弹出第二个页面

 因为我的语音模块里面是周杰伦反方向的钟,所以我把歌词加进去了,你可以自由更改;

要想QT实现串口,需要两个头文件,加到mainwindow.cpp中

  1. #include <QtSerialPort/QSerialPort> // 提供访问串口的功能
  2. #include <QtSerialPort/QSerialPortInfo> // 提供系统中存在的串口信息

此时会报错,因为工程文件(shangwei.pro)还需要添加

QT       +=serialport

此时就可以正常使用头文件内部的函数了。首先我们要配置串口。

2.mainwindow.cpp主要函数

配置串口函数:

  1. void MainWindow::on_pushButton_5_clicked() //打开,关闭
  2. { //是OPEN时,代表没有打开串口
  3. if(ui->pushButton_5->text() == QString("OPEN")) {
  4. //检查串口是否被占用,再次检查一遍
  5. //串口配置
  6. //清空缓冲区
  7. serial = new QSerialPort; //申请内存,并设置父对象
  8. // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件
  9. //QSerialPortInfo::availablePorts()的返回值为QList<QSerialPortInfo> 每一个可用端口组成的容器
  10. foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
  11. {
  12. serial->setPort(info);
  13. if(serial->open(QIODevice::ReadWrite)) // 以读写方式打开串口
  14. {
  15. // 在对象中设置串口
  16. qDebug() << "串口打开成功";
  17. serial->close(); // 关闭
  18. } else
  19. {
  20. qDebug() << "串口打开失败,请重试";
  21. }
  22. }
  23. //设置波特率
  24. serial->setBaudRate( static_cast<QSerialPort::BaudRate> (ui->comboBox_2->currentText().toInt()) );
  25. //设置停止位
  26. serial->setStopBits( static_cast<QSerialPort::StopBits> (ui->comboBox_3->currentText().toInt()));
  27. //设置数据位
  28. serial->setDataBits( static_cast<QSerialPort::DataBits> (ui->comboBox_6->currentText().toInt()) );
  29. //设置校验
  30. serial->setParity ( static_cast<QSerialPort::Parity> (ui->comboBox_4->currentIndex()));
  31. //设置流控
  32. serial->setFlowControl(QSerialPort::NoFlowControl);
  33. //改变按钮上的文本
  34. ui->pushButton_5->setText("CLOSE");
  35. //输出通道的端口名字
  36. ui->lineEdit->setText(serial->portName());
  37. isSerialOpen = serial->open(QIODevice::ReadWrite);
  38. serial->setDataTerminalReady(true);
  39. serial->setReadBufferSize(3);
  40. if (!isSerialOpen) {
  41. qDebug()<< QString("Failed to open serial port:") << serial->errorString();
  42. serial->clearError();
  43. }else {
  44. qDebug()<< QString("The serial port is open: ") ;
  45. }
  46. }else{
  47. ui->pushButton_5->setText("OPEN");
  48. serial->close();
  49. }
  50. }

我这个波特率,停止位等串口设置依赖于窗口的选择;

 选择参数函数:

  1. void MainWindow::initConfig() {
  2. // //创建对象,并建立信号槽
  3. serial = new QSerialPort(this);
  4. // //读函数的信号槽
  5. QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::serial_readyRead);
  6. //添加波特率
  7. QStringList baudList;
  8. baudList << "115200" << "57600" << "9600" ;
  9. ui->comboBox_2->addItems(baudList);
  10. ui->comboBox_2->setCurrentText("115200");
  11. //添加停止位
  12. QStringList baudList1;
  13. baudList1 << "0.5" << "1" << "1.5"<<"2" ;
  14. ui->comboBox_3->addItems(baudList1);
  15. ui->comboBox_3->setCurrentText("1");
  16. //添加数据位
  17. QStringList baudList2;
  18. baudList2 << "8" << "9" ;
  19. ui->comboBox_6->addItems(baudList2);
  20. ui->comboBox_6->setCurrentText("8");
  21. //奇偶校验
  22. QStringList baudList3;
  23. baudList3 << "NO" << "EVEN" ;
  24. ui->comboBox_4->addItems(baudList3);
  25. ui->comboBox_4->setCurrentText("NO");
  26. }

配置完串口函数后需要书写发串口发送数据和接受数据;

发送数据:

  1. void MainWindow::on_pushButton_3_clicked() //发送
  2. {
  3. if(ui->pushButton_5->text() == QString("CLOSE")) {
  4. QByteArray data = ui->textEdit_2->toPlainText().toUtf8();
  5. serial->write(data);
  6. qDebug() <<serial ;
  7. }else{
  8. ui->textEdit->append("请打开串口!!!!!");
  9. }
  10. }

接收函数:

  1. void MainWindow::serial_readyRead()
  2. {
  3. //从接收缓冲区中读取数据
  4. QByteArray buffer = serial->readAll();
  5. //从界面中读取以前收到的数据
  6. QString recv = ui->textEdit->toPlainText();
  7. recv += QString(buffer);
  8. //清空以前的显示
  9. ui->textEdit->clear();
  10. //重新显示
  11. ui->textEdit->append(recv);
  12. qDebug() <<recv<<"cxc" ;
  13. }

清空函数:

  1. void MainWindow::on_pushButton_2_clicked() //清除 接收
  2. {
  3. //清除显示
  4. ui->textEdit->clear();
  5. }

主要函数就这么多,后面会给出完整代码;

2.form.cpp主要函数

其实和上一个函数类型差不多,只是利用槽函数进行发送数据而已

初始化函数:

  1. void Form::on_pushButton_10_clicked()
  2. {
  3. if(ui->pushButton_10->text() == QString("打开串口")) {
  4. //串口配置
  5. //清空缓冲区
  6. serial = new QSerialPort; //申请内存,并设置父对象
  7. // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件
  8. //QSerialPortInfo::availablePorts()的返回值为QList<QSerialPortInfo> 每一个可用端口组成的容器
  9. foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
  10. {
  11. serial->setPort(info);
  12. if(serial->open(QIODevice::ReadWrite)) // 以读写方式打开串口
  13. {
  14. // 在对象中设置串口
  15. qDebug() << "串口打开成功";
  16. serial->close(); // 关闭
  17. } else
  18. {
  19. qDebug() << "串口打开失败,请重试";
  20. }
  21. }
  22. // 参数配置,波特率V
  23. serial->setBaudRate(QSerialPort::Baud115200);
  24. // 校验位,校验默认选择无
  25. serial->setParity(QSerialPort::NoParity);
  26. // 数据位,数据位默认选择8位
  27. serial->setDataBits(QSerialPort::Data8);
  28. // 停止位,停止位默认选择1位
  29. serial->setStopBits(QSerialPort::OneStop);
  30. // 控制流,默认选择无
  31. serial->setFlowControl(QSerialPort::NoFlowControl);
  32. //改变按钮上的文本
  33. ui->pushButton_10->setText("关闭串口");
  34. //输出通道的端口名字
  35. bool isSerialOpen = serial->open(QIODevice::ReadWrite);
  36. serial->setDataTerminalReady(true);
  37. serial->setReadBufferSize(3);
  38. if (!isSerialOpen) {
  39. qDebug()<< QString("Failed to open serial port:") << serial->errorString();
  40. serial->clearError();
  41. configSetEnable1(false);
  42. }else {
  43. qDebug()<< QString("The serial port is open: ") ;
  44. configSetEnable1(true);
  45. }
  46. }else{
  47. configSetEnable1(false);
  48. ui->pushButton_10->setText("打开串口");
  49. serial->close();
  50. }
  51. }

发送函数:

  1. void Form::on_pushButton_13_clicked()
  2. {
  3. QByteArray data ="55";
  4. serial->write(data);
  5. qDebug() <<serial ;
  6. }

我只列举了主要函数,后面会给出完整的代码。

3.STM32部分

我使用的是信盈达的STM32F103ZET6,JQ8900N-16P 语音模块,MQ135模块,MQ2模块以及DHT11温湿度模块和一块LED屏幕。

STM32部分代码太多,后面会打包成压缩文件,先看一下主函数。

1.main函数

  1. #include "stm32f10x.h"
  2. #include "stm32f10x_conf.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "delay.h"
  6. #include "usart.h"
  7. #include "sys.h"
  8. #include "led.h"
  9. #include "key.h"
  10. #include "relay.h"
  11. #include "beep.h"
  12. #include "time.h"
  13. #include "lcd_gui.h"
  14. #include "pic.h"
  15. #include "touch.h"
  16. #include "dht11.h"
  17. #include "adc.h"
  18. int main()
  19. {
  20. u8 T,H;
  21. int num=0,i=0,X=0,Y=0;
  22. u8 ledflag =1;
  23. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  24. Delay_Init();
  25. USART_Config(115200);
  26. BEEPGpioInit();
  27. LEDInit();
  28. KEYGpioInit();
  29. RELAYInit();
  30. LCD_Init();
  31. Adc_Init();
  32. Voice_Config(9600);
  33. int count=5;
  34. Set_Song_Volume(5);
  35. int bo=2;
  36. char MQ[11]={'#','M','Q','1','3','5',':'};
  37. char WEN[5];
  38. char SHI[6];
  39. char MQ22[10]={'#','M','Q','2',':'};
  40. SHI[5]='\0';
  41. WEN[4]='\0';
  42. WEN[0]='T';
  43. SHI[0]='H';
  44. WEN[1]=':';
  45. SHI[1]=':';
  46. MQ[10]='\0';
  47. MQ22[9]='\0';
  48. // LCD_Dis_String(0,0,"棒打林渊!",0x0000, 0xffff, 2,0);
  49. // LCD_Dis_String(0,32,"Hello Tomorrow",0x0000, 0xffff, 2,0);
  50. while(1)
  51. {
  52. if(uart1_finish_flage)
  53. {
  54. if(strcmp(USART1_Rcv_Buff,"11") == 0){
  55. LCD_Clear(0,239,0,319,0xffff);
  56. //处理数据 USART1_Rcv_Buff
  57. LED1_ON;
  58. //处理结束将数组进行清空
  59. LCD_Dis_String(0,0,"LED1_ON",0x0000, 0xffff, 2,0);
  60. }else if(strcmp(USART1_Rcv_Buff,"12") == 0){
  61. LCD_Clear(0,239,0,319,0xffff);
  62. LED1_OFF;
  63. LCD_Dis_String(0,0,"LED1_OFF",0x0000, 0xffff, 2,0);
  64. }else if(strcmp(USART1_Rcv_Buff,"21") == 0){
  65. LCD_Clear(0,239,0,319,0xffff);
  66. LED2_ON;
  67. LCD_Dis_String(0,0,"LED2_ON",0x0000, 0xffff, 2,0);
  68. }else if(strcmp(USART1_Rcv_Buff,"22") == 0){
  69. LCD_Clear(0,239,0,319,0xffff);
  70. LED2_OFF;
  71. LCD_Dis_String(0,0,"LED2_OFF",0x0000, 0xffff, 2,0);
  72. }else if(strcmp(USART1_Rcv_Buff,"31") == 0){
  73. LCD_Clear(0,239,0,319,0xffff);
  74. LED3_ON;
  75. LCD_Dis_String(0,0,"LED3_ON",0x0000, 0xffff, 2,0);
  76. }else if(strcmp(USART1_Rcv_Buff,"32") == 0){
  77. LCD_Clear(0,239,0,319,0xffff);
  78. LED3_OFF;
  79. LCD_Dis_String(0,0,"LED3_OFF",0x0000, 0xffff, 2,0);
  80. }else if(strcmp(USART1_Rcv_Buff,"41") == 0){
  81. LCD_Clear(0,239,0,319,0xffff);
  82. LED4_ON;
  83. LCD_Dis_String(0,0,"LED4_ON",0x0000, 0xffff, 2,0);
  84. }else if(strcmp(USART1_Rcv_Buff,"42") == 0){
  85. LCD_Clear(0,239,0,319,0xffff);
  86. LED4_OFF;
  87. LCD_Dis_String(0,0,"LED4_OFF",0x0000, 0xffff, 2,0);
  88. }else if(strcmp(USART1_Rcv_Buff,"55") == 0){
  89. Set_Song_Volume(count++);
  90. }else if(strcmp(USART1_Rcv_Buff,"66") == 0){
  91. Set_Song_Volume(count--);
  92. }else if(strcmp(USART1_Rcv_Buff,"77") == 0){
  93. Appoint_Song_Name("00001");
  94. }else if(strcmp(USART1_Rcv_Buff,"88") == 0){
  95. Stop_Song();
  96. }else if(strcmp(USART1_Rcv_Buff,"99") == 0){
  97. Xiayi_Song();
  98. }else if(strcmp(USART1_Rcv_Buff,"98") == 0){
  99. Shangyi_Song();
  100. }else if(strcmp(USART1_Rcv_Buff,"13") == 0){
  101. bo=1;
  102. }else if(strcmp(USART1_Rcv_Buff,"14") == 0){
  103. BEEP_ON;
  104. }else if(strcmp(USART1_Rcv_Buff,"15") == 0){
  105. BEEP_OFF;
  106. }else if(strcmp(USART1_Rcv_Buff,"16") == 0){
  107. bo=0;
  108. }
  109. memset(USART1_Rcv_Buff,0,sizeof(USART1_Rcv_Buff));
  110. uart1_count = 0;
  111. uart1_finish_flage =0;
  112. }
  113. if(bo==1){
  114. dht11_read_ht(&T,&H);
  115. LCD_Clear(0,239,0,319,0xffff);
  116. // if(H>80)BEEP_ON ;else BEEP_OFF;
  117. WEN[2]=T/10+'0';
  118. WEN[3]=T%10+'0';
  119. SHI[2]=H/100+'0';
  120. SHI[3]=H/10%10+'0';
  121. SHI[4]=H%10+'0';
  122. int m=ADC_Val_Disp(Mq135);
  123. int m2=ADC_Val_Disp(Mq2);
  124. MQ[7]=m/100+'0';
  125. MQ[8]=m/10%10+'0';
  126. MQ[9]=m%10+'0';
  127. MQ22[5]=m2/1000+'0';
  128. MQ22[6]=m2/100%10+'0';
  129. MQ22[7]=m2/10%10+'0';
  130. MQ22[8]=m2%10+'0';
  131. LCD_Clear(0,239,0,319,0xffff);
  132. LCD_Dis_String(0,0,WEN,0x0000, 0xffff, 2,0);
  133. LCD_Dis_String(0,32,SHI,0x0000, 0xffff, 2,0);
  134. LCD_Dis_String(0,64,MQ,0x0000, 0xffff, 2,0);
  135. LCD_Dis_String(0,32*3,MQ22,0x0000, 0xffff, 2,0);
  136. Delay_ms(500);
  137. }else if(bo==0){
  138. LCD_Clear(0,239,0,319,0xffff);
  139. bo=2;
  140. }
  141. }
  142. return 0;
  143. }

先通过QT给单片机发送指令,单片机收到后会判断是哪一种指令,实行相应的操作。

3.QT完整代码

我的文件是这样的

1.shangwei.pro

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

2.form.h

  1. #ifndef FORM_H
  2. #define FORM_H
  3. #include <QWidget>
  4. #include <QtSerialPort/QSerialPort> // 提供访问串口的功能
  5. #include <QtSerialPort/QSerialPortInfo> // 提供系统中存在的串口信息
  6. namespace Ui {
  7. class Form;
  8. }
  9. class Form : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit Form(QWidget *parent = nullptr);
  14. ~Form();
  15. private slots:
  16. void on_pushButton_clicked();
  17. void on_pushButton_9_clicked();
  18. void on_pushButton_2_clicked();
  19. void on_pushButton_3_clicked();
  20. void on_pushButton_4_clicked();
  21. void on_pushButton_5_clicked();
  22. void on_pushButton_6_clicked();
  23. void on_pushButton_7_clicked();
  24. void on_pushButton_8_clicked();
  25. void on_pushButton_10_clicked();
  26. void on_pushButton_13_clicked();
  27. void on_pushButton_14_clicked();
  28. void on_pushButton_11_clicked();
  29. void on_pushButton_12_clicked();
  30. void on_pushButton_16_clicked();
  31. void on_pushButton_15_clicked();
  32. void on_pushButton_19_clicked();
  33. void on_pushButton_20_clicked();
  34. void on_pushButton_21_clicked();
  35. void on_pushButton_22_clicked();
  36. private:
  37. Ui::Form *ui;
  38. QSerialPort *serial; //定义全局的串口对象
  39. void configSetEnable1(bool b1);
  40. };
  41. #endif // FORM_H

3.mainwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. //串口通信
  5. #include "form.h"
  6. #include <QtSerialPort/QSerialPort> // 提供访问串口的功能
  7. #include <QtSerialPort/QSerialPortInfo> // 提供系统中存在的串口信息
  8. QT_BEGIN_NAMESPACE
  9. namespace Ui { class MainWindow; }
  10. QT_END_NAMESPACE
  11. class MainWindow : public QMainWindow
  12. {
  13. Q_OBJECT
  14. public:
  15. MainWindow(QWidget *parent = nullptr);
  16. ~MainWindow();
  17. private slots:
  18. void on_pushButton_clicked();
  19. void on_pushButton_2_clicked();
  20. void on_pushButton_3_clicked();
  21. void on_pushButton_4_clicked();
  22. void on_pushButton_5_clicked();
  23. private:
  24. Ui::MainWindow *ui;
  25. void SerialPortInit(void);
  26. void initConfig();
  27. void serial_readyRead();
  28. void configSetEnable(bool b);
  29. //串口变量↓
  30. QSerialPort *serial; //定义全局的串口对象
  31. QStringList baudList; //波特率
  32. QStringList parityList; //校验位
  33. QStringList dataBitsList; //数据位
  34. QStringList stopBitsList; //停止位
  35. QStringList flowControlList; //控制流
  36. bool isSerialOpen;
  37. Form *form;
  38. };
  39. #endif // MAINWINDOW_H

4.form.cpp

  1. #include "form.h"
  2. #include "ui_form.h"
  3. #include <QDebug>
  4. #include "mainwindow.h"
  5. #include "QLabel"
  6. #include "QMovie"
  7. Form::Form(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::Form)
  10. {
  11. ui->setupUi(this);
  12. configSetEnable1(false);
  13. QMovie *movie = new QMovie(":/new/prefix1/image/83686B74CD2AF08B32BC013618CD188F.gif");
  14. ui->label->setMovie(movie);
  15. movie->start();
  16. connect(ui->pushButton_17,&QPushButton::clicked,this,[=](){
  17. movie->stop();
  18. });
  19. connect(ui->pushButton_18,&QPushButton::clicked,this,[=](){
  20. movie->start();
  21. });
  22. }
  23. Form::~Form()
  24. {
  25. delete ui;
  26. }
  27. void Form::on_pushButton_clicked() //点亮LED1
  28. {
  29. QByteArray data ="11";
  30. serial->write(data);
  31. qDebug() <<serial ;
  32. }
  33. void Form::on_pushButton_9_clicked()
  34. {
  35. serial->close();
  36. MainWindow *w=new MainWindow;
  37. w->show();
  38. this->close();
  39. }
  40. void Form::on_pushButton_2_clicked() //熄灭LED1
  41. {
  42. QByteArray data ="12";
  43. serial->write(data);
  44. qDebug() <<serial ;
  45. }
  46. void Form::on_pushButton_3_clicked() //点亮LED2
  47. {
  48. QByteArray data ="21";
  49. serial->write(data);
  50. qDebug() <<serial ;
  51. }
  52. void Form::on_pushButton_4_clicked() //熄灭LED2
  53. {
  54. QByteArray data ="22";
  55. serial->write(data);
  56. qDebug() <<serial ;
  57. }
  58. void Form::on_pushButton_5_clicked() //点亮LED3
  59. {
  60. QByteArray data ="31";
  61. serial->write(data);
  62. qDebug() <<serial ;
  63. }
  64. void Form::on_pushButton_6_clicked() //熄灭LED3
  65. {
  66. QByteArray data ="32";
  67. serial->write(data);
  68. qDebug() <<serial ;
  69. }
  70. void Form::on_pushButton_7_clicked() //点亮LED4
  71. {
  72. QByteArray data ="41";
  73. serial->write(data);
  74. qDebug() <<serial ;
  75. }
  76. void Form::on_pushButton_8_clicked() //熄灭LED4
  77. {
  78. QByteArray data ="42";
  79. serial->write(data);
  80. qDebug() <<serial ;
  81. }
  82. void Form::on_pushButton_10_clicked()
  83. {
  84. if(ui->pushButton_10->text() == QString("打开串口")) {
  85. //串口配置
  86. //清空缓冲区
  87. serial = new QSerialPort; //申请内存,并设置父对象
  88. // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件
  89. //QSerialPortInfo::availablePorts()的返回值为QList<QSerialPortInfo> 每一个可用端口组成的容器
  90. foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
  91. {
  92. serial->setPort(info);
  93. if(serial->open(QIODevice::ReadWrite)) // 以读写方式打开串口
  94. {
  95. // 在对象中设置串口
  96. qDebug() << "串口打开成功";
  97. serial->close(); // 关闭
  98. } else
  99. {
  100. qDebug() << "串口打开失败,请重试";
  101. }
  102. }
  103. // 参数配置,波特率V
  104. serial->setBaudRate(QSerialPort::Baud115200);
  105. // 校验位,校验默认选择无
  106. serial->setParity(QSerialPort::NoParity);
  107. // 数据位,数据位默认选择8位
  108. serial->setDataBits(QSerialPort::Data8);
  109. // 停止位,停止位默认选择1位
  110. serial->setStopBits(QSerialPort::OneStop);
  111. // 控制流,默认选择无
  112. serial->setFlowControl(QSerialPort::NoFlowControl);
  113. //改变按钮上的文本
  114. ui->pushButton_10->setText("关闭串口");
  115. //输出通道的端口名字
  116. bool isSerialOpen = serial->open(QIODevice::ReadWrite);
  117. serial->setDataTerminalReady(true);
  118. serial->setReadBufferSize(3);
  119. if (!isSerialOpen) {
  120. qDebug()<< QString("Failed to open serial port:") << serial->errorString();
  121. serial->clearError();
  122. configSetEnable1(false);
  123. }else {
  124. qDebug()<< QString("The serial port is open: ") ;
  125. configSetEnable1(true);
  126. }
  127. }else{
  128. configSetEnable1(false);
  129. ui->pushButton_10->setText("打开串口");
  130. serial->close();
  131. }
  132. }
  133. void Form::on_pushButton_13_clicked()
  134. {
  135. QByteArray data ="55";
  136. serial->write(data);
  137. qDebug() <<serial ;
  138. }
  139. void Form::on_pushButton_14_clicked()
  140. {
  141. QByteArray data ="66";
  142. serial->write(data);
  143. qDebug() <<serial ;
  144. }
  145. void Form::on_pushButton_11_clicked()
  146. {
  147. QByteArray data ="77";
  148. serial->write(data);
  149. qDebug() <<serial ;
  150. }
  151. void Form::on_pushButton_12_clicked()
  152. {
  153. QByteArray data ="88";
  154. serial->write(data);
  155. qDebug() <<serial ;
  156. }
  157. void Form::on_pushButton_16_clicked()
  158. {
  159. QByteArray data ="99";
  160. serial->write(data);
  161. qDebug() <<serial ;
  162. }
  163. void Form::on_pushButton_15_clicked()
  164. {
  165. QByteArray data ="98";
  166. serial->write(data);
  167. qDebug() <<serial ;
  168. }
  169. void Form::configSetEnable1(bool b1)
  170. {
  171. ui->pushButton->setEnabled(b1);
  172. ui->pushButton_2->setEnabled(b1);
  173. ui->pushButton_3->setEnabled(b1);
  174. ui->pushButton_4->setEnabled(b1);
  175. ui->pushButton_5->setEnabled(b1);
  176. ui->pushButton_6->setEnabled(b1);
  177. ui->pushButton_7->setEnabled(b1);
  178. ui->pushButton_8->setEnabled(b1);
  179. ui->pushButton_11->setEnabled(b1);
  180. ui->pushButton_12->setEnabled(b1);
  181. ui->pushButton_13->setEnabled(b1);
  182. ui->pushButton_14->setEnabled(b1);
  183. ui->pushButton_16->setEnabled(b1);
  184. ui->pushButton_15->setEnabled(b1);
  185. ui->pushButton_19->setEnabled(b1);
  186. ui->pushButton_20->setEnabled(b1);
  187. ui->pushButton_21->setEnabled(b1);
  188. ui->pushButton_22->setEnabled(b1);
  189. // ui->pushButton_9->setEnabled(b1);
  190. }
  191. void Form::on_pushButton_19_clicked() //启动蜂鸣器
  192. {
  193. QByteArray data ="14";
  194. serial->write(data);
  195. qDebug() <<serial ;
  196. }
  197. void Form::on_pushButton_20_clicked() //关闭蜂鸣器
  198. {
  199. QByteArray data ="15";
  200. serial->write(data);
  201. qDebug() <<serial ;
  202. }
  203. void Form::on_pushButton_21_clicked()
  204. {
  205. QByteArray data ="13";
  206. serial->write(data);
  207. qDebug() <<serial ;
  208. }
  209. void Form::on_pushButton_22_clicked()
  210. {
  211. QByteArray data ="16";
  212. serial->write(data);
  213. qDebug() <<serial ;
  214. }

5.main.cpp

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. MainWindow w;
  7. w.show();
  8. return a.exec();
  9. }

6.mainwindow.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. //串口通信
  4. #include <QDebug>
  5. #include <QString>
  6. MainWindow::MainWindow(QWidget *parent)
  7. : QMainWindow(parent)
  8. , ui(new Ui::MainWindow)
  9. {
  10. ui->setupUi(this);
  11. initConfig();
  12. form=new Form;
  13. QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::serial_readyRead);
  14. //固定大小
  15. }
  16. MainWindow::~MainWindow()
  17. {
  18. delete ui;
  19. }
  20. void MainWindow::SerialPortInit()
  21. {
  22. serial = new QSerialPort; //申请内存,并设置父对象
  23. // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件
  24. //QSerialPortInfo::availablePorts()的返回值为QList<QSerialPortInfo> 每一个可用端口组成的容器
  25. foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
  26. {
  27. serial->setPort(info);
  28. if(serial->open(QIODevice::ReadWrite)) // 以读写方式打开串口
  29. {
  30. // 在对象中设置串口
  31. qDebug() << "串口打开成功";
  32. serial->close(); // 关闭
  33. } else
  34. {
  35. qDebug() << "串口打开失败,请重试";
  36. }
  37. }
  38. // 参数配置,波特率V
  39. serial->setBaudRate(QSerialPort::Baud19200);
  40. // 校验位,校验默认选择无
  41. serial->setParity(QSerialPort::NoParity);
  42. // 数据位,数据位默认选择8位
  43. serial->setDataBits(QSerialPort::Data8);
  44. // 停止位,停止位默认选择1位
  45. serial->setStopBits(QSerialPort::OneStop);
  46. // 控制流,默认选择无
  47. serial->setFlowControl(QSerialPort::NoFlowControl);
  48. }
  49. void MainWindow::on_pushButton_clicked()
  50. {
  51. form->show();
  52. serial->close();
  53. this->close();
  54. }
  55. void MainWindow::on_pushButton_2_clicked() //清除 接收
  56. {
  57. //清除显示
  58. ui->textEdit->clear();
  59. }
  60. void MainWindow::on_pushButton_3_clicked() //发送
  61. {
  62. if(ui->pushButton_5->text() == QString("CLOSE")) {
  63. QByteArray data = ui->textEdit_2->toPlainText().toUtf8();
  64. serial->write(data);
  65. qDebug() <<serial ;
  66. }else{
  67. ui->textEdit->append("请打开串口!!!!!");
  68. }
  69. }
  70. void MainWindow::on_pushButton_4_clicked() //清除发送
  71. {
  72. //清除显示
  73. ui->textEdit_2->clear();
  74. }
  75. void MainWindow::on_pushButton_5_clicked() //打开,关闭
  76. { //是OPEN时,代表没有打开串口
  77. if(ui->pushButton_5->text() == QString("OPEN")) {
  78. //检查串口是否被占用,再次检查一遍
  79. //串口配置
  80. //清空缓冲区
  81. serial = new QSerialPort; //申请内存,并设置父对象
  82. // 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件
  83. //QSerialPortInfo::availablePorts()的返回值为QList<QSerialPortInfo> 每一个可用端口组成的容器
  84. foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
  85. {
  86. serial->setPort(info);
  87. if(serial->open(QIODevice::ReadWrite)) // 以读写方式打开串口
  88. {
  89. // 在对象中设置串口
  90. qDebug() << "串口打开成功";
  91. serial->close(); // 关闭
  92. } else
  93. {
  94. qDebug() << "串口打开失败,请重试";
  95. }
  96. }
  97. //设置波特率
  98. serial->setBaudRate( static_cast<QSerialPort::BaudRate> (ui->comboBox_2->currentText().toInt()) );
  99. //设置停止位
  100. serial->setStopBits( static_cast<QSerialPort::StopBits> (ui->comboBox_3->currentText().toInt()));
  101. //设置数据位
  102. serial->setDataBits( static_cast<QSerialPort::DataBits> (ui->comboBox_6->currentText().toInt()) );
  103. //设置校验
  104. serial->setParity ( static_cast<QSerialPort::Parity> (ui->comboBox_4->currentIndex()));
  105. //设置流控
  106. serial->setFlowControl(QSerialPort::NoFlowControl);
  107. //改变按钮上的文本
  108. ui->pushButton_5->setText("CLOSE");
  109. //输出通道的端口名字
  110. ui->lineEdit->setText(serial->portName());
  111. isSerialOpen = serial->open(QIODevice::ReadWrite);
  112. serial->setDataTerminalReady(true);
  113. serial->setReadBufferSize(3);
  114. if (!isSerialOpen) {
  115. qDebug()<< QString("Failed to open serial port:") << serial->errorString();
  116. serial->clearError();
  117. }else {
  118. qDebug()<< QString("The serial port is open: ") ;
  119. }
  120. }else{
  121. ui->pushButton_5->setText("OPEN");
  122. serial->close();
  123. }
  124. }
  125. void MainWindow::initConfig() {
  126. // //创建对象,并建立信号槽
  127. serial = new QSerialPort(this);
  128. // //读函数的信号槽
  129. QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::serial_readyRead);
  130. //添加波特率
  131. QStringList baudList;
  132. baudList << "115200" << "57600" << "9600" ;
  133. ui->comboBox_2->addItems(baudList);
  134. ui->comboBox_2->setCurrentText("115200");
  135. //添加停止位
  136. QStringList baudList1;
  137. baudList1 << "0.5" << "1" << "1.5"<<"2" ;
  138. ui->comboBox_3->addItems(baudList1);
  139. ui->comboBox_3->setCurrentText("1");
  140. //添加数据位
  141. QStringList baudList2;
  142. baudList2 << "8" << "9" ;
  143. ui->comboBox_6->addItems(baudList2);
  144. ui->comboBox_6->setCurrentText("8");
  145. //奇偶校验
  146. QStringList baudList3;
  147. baudList3 << "NO" << "EVEN" ;
  148. ui->comboBox_4->addItems(baudList3);
  149. ui->comboBox_4->setCurrentText("NO");
  150. }
  151. void MainWindow::serial_readyRead()
  152. {
  153. //从接收缓冲区中读取数据
  154. QByteArray buffer = serial->readAll();
  155. //从界面中读取以前收到的数据
  156. QString recv = ui->textEdit->toPlainText();
  157. recv += QString(buffer);
  158. //清空以前的显示
  159. ui->textEdit->clear();
  160. //重新显示
  161. ui->textEdit->append(recv);
  162. qDebug() <<recv<<"cxc" ;
  163. }
  164. void MainWindow::configSetEnable(bool b)
  165. {
  166. // ui->comboBox_2->setEnabled(b);
  167. // ui->comboBox_3->setEnabled(b);
  168. // ui->comboBox_6->setEnabled(b);
  169. // ui->comboBox_4->setEnabled(b);
  170. // //
  171. // ui->pushButton_3->setEnabled(!b);
  172. }

4.STM32完整代码

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

文件包

5.实现效果

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/700182
推荐阅读
相关标签
  

闽ICP备14008679号