前言
前一篇文章讲到了利用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