当前位置:   article > 正文

QT5串口编程——编写简单的上位机_qt pc 串口 开发 实例

qt pc 串口 开发 实例


转自: QT5串口编程——编写简单的上位机_培培哥的博客-CSDN博客_qt写上位机

1.添加库,添加类

首先,QT5是自带QSerialPort(Qt5封装的串口类)这个类的,使用时需要在pro文件里面添加一行:

QT       += serialport
  • 1

在mainwindow.cpp文件夹中加入以下两个头文件

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

QT5中,串口通信是借助一个QSerialPort的对象来实现的,在设置QSerialPort对象对串口的名称、波特率、数据位、校验位、停止位等参数后,方能对串口进行读写。下面,我总结了一下借助QSerailPort对串口进行设置、打开、读、写和关闭的过程。

一、设置和打开串口

  1. //创建串口对象
  2. QSerialPort serial;
  3. //设置串口名
  4. serial.setPortName("COM3");
  5. //设置波特率
  6. serial.setBaudRate(QSerialPort::Baud9600);
  7. //设置数据位数
  8. serial.setDataBits(QSerialPort::Data8);
  9. //设置奇偶校验
  10. serial.setParity(QSerialPort::NoParity);
  11. //设置停止位
  12. serial.setStopBits(QSerialPort::OneStop);
  13. //设置流控制
  14. serial.setFlowControl(QSerialPort::NoFlowControl);
  15. //打开串口
  16. serial.open(QIODevice::ReadWrite);

以上代码是QSerialPort对象的设置示例,作用是:

  • 设置串口名为 COM3
  • 设置波特率为9600
  • 设置数据位为8位
  • 设置没有奇偶校验位
  • 设置停止位为1位
  • 设置没有流控制
  • 以可读写的方式打开串口

设置完这些就能进行读写操作了。如果遇到不理解的地方,可以选择QT的类或函数,然后按F1查阅手册。举个例子,如果我们想查看QSerialPort的其它的属性,可以选择QSerialPort的类名或成员函数,然后按F1。

二、读取数据

  1. //从接收缓冲区中读取数据
  2. QByteArray buffer = serial.readAll();
  • 1
  • 2

串口在收到数据后,会将数据存入接收缓冲区。此时,我们可以通过readAll()函数将接收缓冲区的数据读出来。当串口的接收缓冲区有数据时,QSerilaPort对象会发出一个readyRead()的信号。因此,我们可以编写一个槽函数来读数据,例如:

  1. //连接信号和槽
  2. QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
  3. //……
  4. //编写的槽函数
  5. void MainWindow::serialPort_readyRead()
  6. {
  7. //从接收缓冲区中读取数据
  8. QByteArray buffer = serial.readAll();
  9. //处理数据
  10. //……
  11. }

三、发送数据

serial->write(data);
  • 1

使用write函数便可以把字节数组中的字节发送出去。

四、关闭串口

serial->close();
  • 1

串口不用时,可通过close()函数将其关闭。

接下来是一个实例

1、创建一个新的Widgets Appliaction工程

2、使用QtCreator的ui文件来设计上位机的界面,设计如下:

img

3、mainwindow.h文件内容如下:

  1. //mainwindow.h
  2. #ifndef MAINWINDOW_H
  3. #define MAINWINDOW_H
  4. #include <QMainWindow>
  5. #include <QSerialPort>
  6. #include <QSerialPortInfo>
  7. namespace Ui {
  8. class MainWindow;
  9. }
  10. class MainWindow : public QMainWindow
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit MainWindow(QWidget *parent = 0);
  15. ~MainWindow();
  16. private slots:
  17. void serialPort_readyRead();
  18. void on_searchButton_clicked();
  19. void on_openButton_clicked();
  20. void on_sendButton_clicked();
  21. void on_clearButton_clicked();
  22. private:
  23. Ui::MainWindow *ui;
  24. QSerialPort serial;
  25. };
  26. #endif // MAINWINDOW_H

  • 1

4、mainwindow.cpp文件内容如下:

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、测试结果

在这里插入图片描述

仿:

新建QT程序的mainwindow,QT只要有几个文件组成:
(废话)
.pro文件是整个文件的开端 ,程序是从这里开始的,当然他是我们工程打开的地方;程序需要加什么类,什么文件都是在这里操作的
mianwindow.h是mainwindow.cpp的头文件,.cpp里面的东西都会在.h里面出现,.cpp里面要调用的头文件,也会在这里面进行声明;
mainwindow.cpp里面包含了,开始的程序,槽函数,关闭的函数

1.创建QT的mianwindow工程

2.对原作者的界面进行仿制,如图所示

在这里插入图片描述

3.对STC下载器的串口进行研究获得其:波特率,停止位,数据位,校验位,停止位的选项

在这里插入图片描述

4.制作选项,串口号是根据机器自己的监测进行生成

在这里插入图片描述

5.分别新建4个槽函数,信号为clicked()

在这里插入图片描述

6.我们首先将上位机的大小进行固定,防止拖动,对界面美观产生影响;将上位机的背景板移动到合适的大小,在mianwindow可以查看要设置的大小,我这里要设置的大小是430x531

在这里插入图片描述

7.在开机程序中添加修改界面大小的程序,添加上位机的最大尺寸和最小尺寸

在这里插入图片描述

8.进行仿真,效果如图:可以在图中看见放大按键消失了

在这里插入图片描述

9.添加需要的类和头文件

在.pro中添加:

QT += serialport     

在.h文件中添加

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

10.mianwindow.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QMessageBox>
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. ui->comboBox->clear();
  10. //通过QSerialPortInfo查找可用串口
  11. foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  12. {
  13. ui->comboBox->addItem(info.portName());
  14. }
  15. this->setMaximumSize(430,531);
  16. this->setMinimumSize(430,531);
  17. //连接信号和槽
  18. QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
  19. }
  20. MainWindow::~MainWindow()
  21. {
  22. delete ui;
  23. }
  24. //监测串口
  25. void MainWindow::on_pushButton_3_clicked()
  26. {
  27. ui->comboBox->clear();
  28. //通过QSerialPortInfo查找可用串口
  29. foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  30. {
  31. ui->comboBox->addItem(info.portName());
  32. }
  33. }
  34. //打开串口
  35. void MainWindow::on_pushButton_4_clicked()
  36. {
  37. if(ui->pushButton_4->text()==QString("打开串口"))
  38. {
  39. //设置串口名
  40. serial.setPortName(ui->comboBox->currentText());
  41. //设置波特率
  42. serial.setBaudRate(ui->comboBox_2->currentText().toInt());
  43. //设置数据位数
  44. switch(ui->comboBox_3->currentIndex())
  45. {
  46. case 8: serial.setDataBits(QSerialPort::Data8); break;
  47. default: break;
  48. }
  49. //设置奇偶校验
  50. switch(ui->comboBox_4->currentIndex())
  51. {
  52. case 0: serial.setParity(QSerialPort::NoParity); break;
  53. default: break;
  54. }
  55. //设置停止位
  56. switch(ui->comboBox_5->currentIndex())
  57. {
  58. case 1: serial.setStopBits(QSerialPort::OneStop); break;
  59. case 2: serial.setStopBits(QSerialPort::TwoStop); break;
  60. default: break;
  61. }
  62. //设置流控制
  63. serial.setFlowControl(QSerialPort::NoFlowControl);
  64. //打开串口
  65. if(!serial.open(QIODevice::ReadWrite))
  66. {
  67. QMessageBox::about(NULL,"提示","无法打开串口!");
  68. return;
  69. }
  70. //下拉菜单控件失能
  71. ui->comboBox->setEnabled(false);
  72. ui->comboBox_2->setEnabled(false);
  73. ui->comboBox_3->setEnabled(false);
  74. ui->comboBox_4->setEnabled(false);
  75. ui->comboBox_5->setEnabled(false);
  76. ui->pushButton_4->setText(QString("关闭串口"));
  77. //发送按键使能
  78. ui->pushButton_2->setEnabled(true);
  79. }
  80. else
  81. {
  82. //关闭串口
  83. serial.close();
  84. //下拉菜单控件使能
  85. ui->comboBox->setEnabled(true);
  86. ui->comboBox_2->setEnabled(true);
  87. ui->comboBox_3->setEnabled(true);
  88. ui->comboBox_4->setEnabled(true);
  89. ui->comboBox_5->setEnabled(true);
  90. ui->pushButton_4->setText(QString("打开串口"));
  91. //发送按键失能
  92. ui->pushButton_2->setEnabled(false);
  93. }
  94. }
  95. //发送数据
  96. void MainWindow::on_pushButton_2_clicked()
  97. {
  98. //获取界面上的数据并转换成utf8格式的字节流
  99. QByteArray data = ui->textEdit_2->toPlainText().toUtf8();
  100. serial.write(data);
  101. }
  102. //清空接收
  103. void MainWindow::on_pushButton_clicked()
  104. {
  105. ui->textEdit->clear();
  106. }
  107. //串口接收
  108. void MainWindow::serialPort_readyRead()
  109. {
  110. //从接收缓冲区中读取数据
  111. QByteArray buffer = serial.readAll();
  112. //从界面中读取以前收到的数据
  113. QString recv = ui->textEdit->toPlainText();
  114. recv += QString(buffer);
  115. //清空以前的显示
  116. ui->textEdit->clear();
  117. //重新显示
  118. ui->textEdit->append(recv);
  119. }

11.mianwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QSerialPort> //提供访问串口的功能
  5. #include <QSerialPortInfo> //提供系统中存在的串口的信息
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9. class MainWindow : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit MainWindow(QWidget *parent = 0);
  14. ~MainWindow();
  15. private slots:
  16. void serialPort_readyRead();
  17. void on_pushButton_3_clicked();
  18. void on_pushButton_4_clicked();
  19. void on_pushButton_2_clicked();
  20. void on_pushButton_clicked();
  21. private:
  22. Ui::MainWindow *ui;
  23. QSerialPort serial;
  24. };
  25. #endif // MAINWINDOW_H

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

闽ICP备14008679号