• QT5串口编程——编写简单的上位机



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

    1.添加库,添加类

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

    QT       += serialport
    
    • 1

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

    1. #include //提供访问串口的功能
    2. #include //提供系统中存在的串口的信息
    • 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
    5. #include
    6. #include
    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
    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 //提供访问串口的功能
    2. #include //提供系统中存在的串口的信息
    • 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
    4. #include //提供访问串口的功能
    5. #include //提供系统中存在的串口的信息
    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

  • 相关阅读:
    CPU性能优化——“瑞士军刀“
    SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.2 JdbcTemplate
    jsp servlet mysql实现的二手车汽车管理系统项目源码附带视频指导运行教程
    Sentinel微服务流量治理组件实战上
    第13期 | GPTSecurity周报
    信息化发展29
    LVS+KeepAlived高可用部署实战应用
    Go语言 错误处理
    2023年天津中德应用技术大学专升本飞行器制造工程专业考试大纲
    vue实现单页面仿照购物车案例——基于mint-ui和vue2.0
  • 原文地址:https://blog.csdn.net/delphigbg/article/details/127682019