QT (1) 编写Qt类库来设计上下位机串口通信系统的上位机

本文介绍了如何使用QT Creator将上位机部分的代码编写成QT类库,以解耦图形界面和数据处理代码。通过创建QT程序、QT类库,编写并调用类库,以及进行优化,实现了一个通用的串口通信系统上位机。最终,通过信号和线程控制,优化了读取通道号的逻辑。
摘要由CSDN通过智能技术生成
前言

前一篇文章讲到了利用C#窗体应用程序来设计上位机的界面软件,但是这样的界面软件还不够通用,只能定制化运行,图形界面的代码和上位机初步处理数据的代码耦合性较高。所以这篇文章讲了利用QT Creator将上位机部分的代码编写成QT类库,从而和图形界面解耦合,如果使用不同的软件开发图形界面,都可以使用到这个类库。

创建一个QT程序

  • 首先我们需要创建一个QT程序来当做这个类库的主窗体,打开Qt Creator后,选择工具栏"文件"->“新建文件或项目”->“项目”->“Application”->“Qt Widgets Application”;
    在这里插入图片描述
  • 单击"Choose"后,重新命名,选择文件存放路径,点击"下一步";
    在这里插入图片描述
  • 根据自己需要选择"Kits",点击"下一步";然后命名各个文件名和基类名,点击"下一步";最后点击"完成"就可以生成一个Qt主程序了。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

创建QT类库

  • 首先右键项目栏中的QT项目名,选择"添加新文件",接着选择"C++"->“C++ Class”,点击"Choose";
    在这里插入图片描述
  • 给类名取名,选择要包含的基类,点击"下一步";
    在这里插入图片描述
  • 可以看到该C++类就被添加到主项目里了,最后点击"完成"。头文件就被放到主项目的Headers文件夹下,.cpp文件就放到Sources文件夹下了。
    在这里插入图片描述

编写QT类库

  • 我们在刚创建的头文件的类里创建各个变量和函数,以光开关模块为例,代码如下所示。
#ifndef BOTDR_H
#define BOTDR_H

#include <QMainWindow>
#include <QObject>                        //Qt链接函数所用
#include <QtSerialPort/QSerialPort>       //Qt串口类
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>                        //qDebug所用
#include <QtDebug>
#include <QThread>                      //Qt多进程所用

class BOTDR : public QThread
{
   
    Q_OBJECT

public:
    explicit BOTDR();
    ~BOTDR();
    bool ComOpen(int BaudRate);                    //Qt串口打开函数         
    bool ComClose();	                           //Qt串口关闭函数  
    bool SendData(int *frame, int length);         //Qt串口发送数据函数 
    bool OpticalSwitchSetting(int ChannelNumber);  //光开关下发命令函数 
	int CalBIP8(int *data);                        //异或校验码函数      
	 
    struct QTARGC        //用来显示下位机参数的结构体
    {
   
        int Module;       //各个模块的标识码
        int Optical_Rx;   //存放下位机返回的通道号参数
        bool IsSuccess;
        bool IsUpdate;
        int Error;
        int Warning;
        int ErrorExtense;
    };
    QTARGC QtArgc;


signals:
    void readyRead();     //信号函数
    void DataRead();

public slots:
    void ReceivedData();  //Qt串口接收数据函数,也是事件函数,由信号函数触发

private:
    QSerialPort* MySerial;       //实例化一个私有串口
    QByteArray txdata;           //串口接收的QByteArray

    const int OpticalSwitch = 0x03;

protected:
    void run();
};


#endif // BOTDR_H

  • 接着我们在创建的.cpp文件里编写类先关的函数。
#include "botdr.h"

BOTDR::BOTDR()
{
   
    //构造函数初始化串口和参数
    MySerial = new QSerialPort();  
    QtArgc.Optical_Rx = 0
编写上位机串口通信通常使用Qt框架。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的库和工具,用于创建GUI应用程序和与硬件进行通信。 以下是在Qt编写上位机串口通信的一般步骤: 1. 安装Qt框架:首先需要在您的开发环境中安装Qt框架,并配置相应的开发环境。 2. 创建Qt应用程序:使用Qt Creator或其他IDE创建一个新的Qt应用程序。 3. 配置串口设备:使用Qt提供的串口设备API(例如QSerialPort)找到您的目标设备的串口信息。这通常需要在硬件设备的文档中找到串口的名称、波特率、数据位、停止位和校验位等信息。 4. 打开串口设备:使用QSerialPort类打开指定的串口设备。 5. 读取和写入数据:使用QSerialPort类的read()和write()方法来读取和写入数据。这些方法允许您从串口设备读取数据并发送数据到串口设备。 6. 关闭串口设备:在完成通信后,使用QSerialPort类的close()方法关闭串口设备。 7. 显示通信结果:将通信结果显示在Qt应用程序的用户界面上,以便用户可以查看通信过程和结果。 以下是一个简单的示例代码片段,用于在Qt中打开串口设备并读取数据: ```cpp #include <QSerialPort> #include <QDebug> void readFromSerial() { QSerialPort serial; serial.setPortName("COM1"); // 设置串口名称 serial.setBaudRate(QSerialPort::Baud9600); // 设置波特率 serial.setDataBits(QSerialPort::Data8); // 设置数据位 serial.setParity(QSerialPort::NoParity); // 设置校验位 serial.setStopBits(QSerialPort::OneStop); // 设置停止位 serial.setFlowControl(QSerialPort::NoFlowControl); // 设置流控制 if (serial.open(QIODevice::ReadWrite)) { // 打开串口设备 while (true) { char c = serial.readLine(10); // 读取一行数据(最多10个字节) if (!c.isEmpty()) { qDebug() << "Received data:" << c; // 输出接收到的数据 } else { break; // 如果没有接收到数据,退出循环 } } serial.close(); // 关闭串口设备 } else { qDebug() << "Failed to open serial port"; // 输出打开串口失败的消息 } } ``` 这是一个非常基础的示例,它只读取一行数据并将其输出到控制台。在实际应用中,您可能需要将通信结果显示在Qt应用程序的用户界面上,并处理各种错误和异常情况。 请注意,上述代码仅适用于Windows操作系统上的串口通信。如果您使用的是其他操作系统(如Linux或macOS),则需要使用不同的API和库来访问串口设备。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值