项目实战:Qt球机控制工具 v1.0.0(球机运动八个方向以及运动速度,设置运动到指定角度,查询当前水平和垂直角度)

简介: 项目实战:Qt球机控制工具 v1.0.0(球机运动八个方向以及运动速度,设置运动到指定角度,查询当前水平和垂直角度)

需求

  1.调试球机控制,方向速度,设置到指定的角度;

  2.支持串口,485等基于串口的协议端口配置打开;

  3.子线程串口控制和.子线程协议解析;

  4.支持球机水平运动速度、垂直运动速度设置;

  5.支持球机运动八个方向:上、右上、右、右下、下、左下、左、左上;

  6.支持变倍缩放;

  7.支持变焦距(球机自动对焦则无效)

  8.光圈(球机支持才行)

  9.显示当前球机角度;

  10.设置球机运动到指定的水平位置;

  11.设置球机运动到指定的垂直位置;


注意

  有的球机运动以及一些其他控制指令没有协议返回,理论上有返回,但是球机无返回只有查询协议有返回)。


Demo演示

  

  

  


调试工具下载地址

  CSDN免积分下载:https://download.csdn.net/download/qq21497936/48131428

  QQ群:1047134658(点击“文件”搜索“cameraMove ”,群内与博文同步更新)


相关头文件

CameraMoveToolDemo.h

#ifndef CAMERAMOVETOOLDEMO_H
#define CAMERAMOVETOOLDEMO_H
#include <QWidget>
#include <QElapsedTimer>
#include "ArrowControlWidget.h"
#include "ProtocolPelcoDManager.h"
namespace Ui {
class CameraMoveToolDemo;
}
class CameraMoveToolDemo : public QWidget
{
    Q_OBJECT
public:
    explicit CameraMoveToolDemo(QWidget *parent = 0);
    ~CameraMoveToolDemo();
protected:
    void initControls();
    void updateControls();
    void queryAngle();
protected slots:                // 与方向操作键盘的槽函数
    void slot_arrowControlButtonEvent(ArrowControlWidget::DIRECT direct, bool pressed);
protected slots:                // 串口打开与关闭信号槽
    void slot_serialPortOpened(bool result);
    void slot_serialPortClosed(bool result);
protected slots:
    void slot_event(ProtocolPelcoDManager::EVENT_TYPE eventType, double value);
protected:
    void timerEvent(QTimerEvent *event);
private slots:                  // 按键消息
    void on_pushButton_open_clicked();
    void on_pushButton_close_clicked();
    void on_horizontalSlider_horizalSpeed_valueChanged(int value);
    void on_horizontalSlider_vertialcaSpeed_valueChanged(int value);
    void on_pushButton_zoomTele_pressed();
    void on_pushButton_zoomTele_released();
    void on_pushButton_focusNear_pressed();
    void on_pushButton_focusNear_released();
    void on_pushButton_irisOpen_pressed();
    void on_pushButton_irisOpen_released();
    void on_pushButton_zoomWide_pressed();
    void on_pushButton_zoomWide_released();
    void on_pushButton_focusFar_pressed();
    void on_pushButton_focusFar_released();
    void on_pushButton_irisClose_pressed();
    void on_pushButton_irisClose_released();
    void on_pushButton_setHorizalAngle_clicked();
    void on_pushButton_verticalAngle_clicked();
private:
    Ui::CameraMoveToolDemo *ui;
private:
    int _timerId;
    int _queryIntervalMs;
};
#endif // CAMERAMOVETOOLDEMO_H

ArrowControlWidget.h

#ifndef ARROWCONTROLWIDGET_H
#define ARROWCONTROLWIDGET_H
/**********************************************************************\
 * 类名: ArrowControlWidget
 * 说明: 方向键盘按键
 * 著作权信息
 *      作者:红胖子(AAA红模仿)
 *      公司:长沙红胖子网络科技有限公司
 *      网址:hpzwl.blog.csdn.net
 *      联系方式:QQ(21497936) 微信(yangsir198808) 电话(15173255813)
 * 版本信息
 *       日期             版本           描述
 *    2021年11月23日     v1.0.0         基础功能
\**********************************************************************/
#include <QWidget>
#include <QPushButton>
namespace Ui {
class ArrowControlWidget;
}
class ArrowControlWidget : public QWidget
{
    Q_OBJECT
public:
    enum DIRECT {               // 方向
        DIRECT_STOP = 0x00,
        DIRECT_UP,
        DIRECT_RIGHT_UP,
        DIRECT_RIGHT,
        DIRECT_RIGHT_DOWN,
        DIRECT_DOWN,
        DIRECT_LEFT_DOWN,
        DIRECT_LEFT,
        DIRECT_LEFT_UP,
    };
public:
    explicit ArrowControlWidget(QWidget *parent = 0);
    ~ArrowControlWidget();
signals:
    void signal_buttonEvent(ArrowControlWidget::DIRECT direct, bool pressed);
                                                    // 不是true - pressed,就是false - release
protected:
    void initControls();
private slots:
    void slot_buttonPressed();
    void slot_buttonRelease();
private:
    Ui::ArrowControlWidget *ui;
private:
    QHash<QPushButton*, ArrowControlWidget::DIRECT> _hashPushButton2Direct;
};
#endif // ARROWCONTROLWIDGET_H

SerialPortManager.h

#ifndef SERIALPORTMANAGER_H
#defineSERIALPORTMANAGER_H
/**********************************************************************\
 * 类名: SerialPortManager
 * 说明: 串口相关操作
 * 信号:
 *       void signal_recevData(QByteArray byteArray) -- 抛出收到的数据
 *       void signal_error(int err) -- 抛出错误信息
 * 成员函数:
 *          bool isRunning() -- 是否已经在运行
 *          void serialError(QSerialPort::SerialPortError) -- 错误接受槽函数
 * 线程函数:
 *          void slot_start() -- 开始运行
 *          void slot_stop() -- 停止运行
 * 部分函数:
 *          QStringList getAllSerialPortNames() -- 获取所有串口
 *          QString getPortName() -- 获取当前串口设备名称
 *          void setPortName() -- 设置当前串口设备名称
 *          void slot_open() -- 打开串口
 *          void slot_close() -- 关闭串口
 *          void slot_sendData(QByteArray byteArray) -- 发送数据
 *          void setPortName(QString name) -- 设置串口名称,如"com1"(windows),"/dev/ttyS0"(linux)
 *          void setSerialPortSettings(SerialPortSettings& serialPortSettings) -- 配置串口相关参数
 * 著作权信息
 *      作者:红胖子(AAA红模仿)
 *      公司:长沙红胖子网络科技有限公司
 *      网址:hpzwl.blog.csdn.net
 *      联系方式:QQ(21497936) 微信(yangsir198808) 电话(15173255813)
 * 版本信息
 *       日期             版本           描述
 *    2016年11月11日     v1.0.0         基础功能
 *    2019年06月02日     v1.1.0         增加串口默认初始化参数“9600,8,无奇偶,1,noFlow",增加设置获取设备名,增加获取所有串口名
 *    2020年07月06日     v1.2.0         修改模块名称,规划代码
 *    2020年07月08日     v1.3.0         唯一实例类
 *    2021年11月23日     v1.4.0         整理代码,增加设置单项配置串口信息枚举,增加单项设置波特率数字和字符串(如9600,"N","1"等)
\**********************************************************************/
#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QMutex>
class SerialPortManager : public QObject
{
    Q_OBJECT
public:
    struct SerialPortSettings{
        SerialPortSettings():
            baudRate(QSerialPort::Baud9600),
            dataBits(QSerialPort::Data8),
            parity(QSerialPort::NoParity),
            stopBit(QSerialPort::OneStop),
            flowControl(QSerialPort::NoFlowControl)
        {
        }
        QSerialPort::BaudRate baudRate;
        QSerialPort::DataBits dataBits;
        QSerialPort::Parity parity;
        QSerialPort::StopBits stopBit;
        QSerialPort::FlowControl flowControl;
    };
private:
    explicit SerialPortManager(QObject *parent = 0);
public:
    ~SerialPortManager();
public:
    static SerialPortManager *getInstance();
public:
    bool getRunning() const;                                // 当前线程是否运行
    bool getOpened() const;                                 // 串口是非都开
    QString getPortName();                                  // 获取串口名
    SerialPortSettings getSerialPortSettings() const;       // 获取串口配置信息
public:
    void setPortName(QString name);                         // 设置串口名称
    void setSerialPortSettings(SerialPortSettings &serialPortSettings);
                                                            // 设置串口配置信息(一次性)
    void setBaudRate(QSerialPort::BaudRate baudRate);       // 设置串口波特率
    void setBaudRate(int baudRate);                         // 设置串口波特率
    void setDateBits(QSerialPort::DataBits dataBits);       // 设置数据位
    void setDateBits(int dateBits);                         // 设置数据位
    void setParity(QSerialPort::Parity parity);             // 设置校验方式
    void setParity(QString parity);                         // 设置校验方式
    void setStopBit(QSerialPort::StopBits stopBits);        // 设置停止位
    void setStopBit(QString stopBits);                      // 设置停止位
    void setFlowControl(QSerialPort::FlowControl flowControl);
                                                            // 设置硬件流控制
public:
    static QStringList getAllSerialPortNames();
signals:
    void signal_opened(bool result);                        // 打开信号
    void signal_closed(bool result);                        // 关闭信号
    void signal_recevData(QByteArray byteArray);            // 接收数据信号
    void signal_error(int err);                             // 错误代码
public:
    void open(QString portName = QString());                // 打开串口(抛送到串口线程)
    void close();                                           // 关闭串口(抛送到串口线程)
public:
    void sendData(QByteArray byteArray);                    // 发送数据(抛送到串口线程)
public slots:
    void slot_start();                                      // 线程开启
    void slot_stop();                                       // 线程停止
    void slot_open(QString portName = QString());           // 线程打开
    void slot_close();                                      // 线程关闭
    void slot_sendData(QByteArray byteArray);               // 发送数据
protected:
    void initControls();                                    // 初始化
protected slots:
    void slot_recv();                                       // 接收数据
    void slot_serialError(QSerialPort::SerialPortError);    // 接收锁雾
private:
    static SerialPortManager *_pInstance;
    static QMutex _mutex;
private:
    bool _running;                                          // 是否正在运行
    QSerialPort *_pSerialPort;                              // 串口指针
    SerialPortSettings _serialPortSettings;                 // 串口设置信息
private:
    bool _opened;                                           // 串口是否打开
    QString _portName;                                      // 串口名称
    int _id;
};
#endif // SEARIALPORT_H

ProtocolPelcoDManager.h

#ifndef SERIALPORTMANAGER_H
#defineSERIALPORTMANAGER_H
/**********************************************************************\
 * 类名: SerialPortManager
 * 说明: 串口相关操作
 * 信号:
 *       void signal_recevData(QByteArray byteArray) -- 抛出收到的数据
 *       void signal_error(int err) -- 抛出错误信息
 * 成员函数:
 *          bool isRunning() -- 是否已经在运行
 *          void serialError(QSerialPort::SerialPortError) -- 错误接受槽函数
 * 线程函数:
 *          void slot_start() -- 开始运行
 *          void slot_stop() -- 停止运行
 * 部分函数:
 *          QStringList getAllSerialPortNames() -- 获取所有串口
 *          QString getPortName() -- 获取当前串口设备名称
 *          void setPortName() -- 设置当前串口设备名称
 *          void slot_open() -- 打开串口
 *          void slot_close() -- 关闭串口
 *          void slot_sendData(QByteArray byteArray) -- 发送数据
 *          void setPortName(QString name) -- 设置串口名称,如"com1"(windows),"/dev/ttyS0"(linux)
 *          void setSerialPortSettings(SerialPortSettings& serialPortSettings) -- 配置串口相关参数
 * 著作权信息
 *      作者:红胖子(AAA红模仿)
 *      公司:长沙红胖子网络科技有限公司
 *      网址:hpzwl.blog.csdn.net
 *      联系方式:QQ(21497936) 微信(yangsir198808) 电话(15173255813)
 * 版本信息
 *       日期             版本           描述
 *    2016年11月11日     v1.0.0         基础功能
 *    2019年06月02日     v1.1.0         增加串口默认初始化参数“9600,8,无奇偶,1,noFlow",增加设置获取设备名,增加获取所有串口名
 *    2020年07月06日     v1.2.0         修改模块名称,规划代码
 *    2020年07月08日     v1.3.0         唯一实例类
 *    2021年11月23日     v1.4.0         整理代码,增加设置单项配置串口信息枚举,增加单项设置波特率数字和字符串(如9600,"N","1"等)
\**********************************************************************/
#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QMutex>
class SerialPortManager : public QObject
{
    Q_OBJECT
public:
    struct SerialPortSettings{
        SerialPortSettings():
            baudRate(QSerialPort::Baud9600),
            dataBits(QSerialPort::Data8),
            parity(QSerialPort::NoParity),
            stopBit(QSerialPort::OneStop),
            flowControl(QSerialPort::NoFlowControl)
        {
        }
        QSerialPort::BaudRate baudRate;
        QSerialPort::DataBits dataBits;
        QSerialPort::Parity parity;
        QSerialPort::StopBits stopBit;
        QSerialPort::FlowControl flowControl;
    };
private:
    explicit SerialPortManager(QObject *parent = 0);
public:
    ~SerialPortManager();
public:
    static SerialPortManager *getInstance();
public:
    bool getRunning() const;                                // 当前线程是否运行
    bool getOpened() const;                                 // 串口是非都开
    QString getPortName();                                  // 获取串口名
    SerialPortSettings getSerialPortSettings() const;       // 获取串口配置信息
public:
    void setPortName(QString name);                         // 设置串口名称
    void setSerialPortSettings(SerialPortSettings &serialPortSettings);
                                                            // 设置串口配置信息(一次性)
    void setBaudRate(QSerialPort::BaudRate baudRate);       // 设置串口波特率
    void setBaudRate(int baudRate);                         // 设置串口波特率
    void setDateBits(QSerialPort::DataBits dataBits);       // 设置数据位
    void setDateBits(int dateBits);                         // 设置数据位
    void setParity(QSerialPort::Parity parity);             // 设置校验方式
    void setParity(QString parity);                         // 设置校验方式
    void setStopBit(QSerialPort::StopBits stopBits);        // 设置停止位
    void setStopBit(QString stopBits);                      // 设置停止位
    void setFlowControl(QSerialPort::FlowControl flowControl);
                                                            // 设置硬件流控制
public:
    static QStringList getAllSerialPortNames();
signals:
    void signal_opened(bool result);                        // 打开信号
    void signal_closed(bool result);                        // 关闭信号
    void signal_recevData(QByteArray byteArray);            // 接收数据信号
    void signal_error(int err);                             // 错误代码
public:
    void open(QString portName = QString());                // 打开串口(抛送到串口线程)
    void close();                                           // 关闭串口(抛送到串口线程)
public:
    void sendData(QByteArray byteArray);                    // 发送数据(抛送到串口线程)
public slots:
    void slot_start();                                      // 线程开启
    void slot_stop();                                       // 线程停止
    void slot_open(QString portName = QString());           // 线程打开
    void slot_close();                                      // 线程关闭
    void slot_sendData(QByteArray byteArray);               // 发送数据
protected:
    void initControls();                                    // 初始化
protected slots:
    void slot_recv();                                       // 接收数据
    void slot_serialError(QSerialPort::SerialPortError);    // 接收锁雾
private:
    static SerialPortManager *_pInstance;
    static QMutex _mutex;
private:
    bool _running;                                          // 是否正在运行
    QSerialPort *_pSerialPort;                              // 串口指针
    SerialPortSettings _serialPortSettings;                 // 串口设置信息
private:
    bool _opened;                                           // 串口是否打开
    QString _portName;                                      // 串口名称
    int _id;
};
#endif // SEARIALPORT_H


相关文章
|
5月前
|
存储 C++
基于Qt的简易文件压缩与解压缩工具设计与实现
基于Qt的简易文件压缩与解压缩工具设计与实现
255 1
|
5月前
|
算法 前端开发 C++
【Qt UI相关】Qt设置窗体或控件的背景色透明
【Qt UI相关】Qt设置窗体或控件的背景色透明
527 0
|
11月前
|
存储 Cloud Native Linux
C++Qt表格控件一些常用的设置封装
C++Qt表格控件一些常用的设置封装
|
3月前
QT设置widget背景图片
该内容介绍如何在Qt中为控件添加背景图片。主要方法包括:1) 在样式表中使用`border-image`属性指定控件及其背景图片;2) 使用调色板`QPalette`设置图片,但可能导致窗口显示不下;3) 在`paintEvent`中绘制图片,适合自定义绘图但不适用于子窗口;4) 通过覆盖一个大小与窗口相同的`QLabel`来设置背景图片,可实现动态背景。推荐使用样式表设置背景,简单高效且适合子窗口。
188 3
|
2月前
|
网络协议
【qt】TCP的监听 (设置服务器IP地址和端口号)
【qt】TCP的监听 (设置服务器IP地址和端口号)
89 0
|
5月前
|
Windows
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
|
12月前
|
数据安全/隐私保护
PyQt5-Qt Designer控件之间的伙伴关系和Tab顺序如何设置?
PyQt5-Qt Designer控件之间的伙伴关系和Tab顺序如何设置?
81 0
PyQt5-Qt Designer控件之间的伙伴关系和Tab顺序如何设置?
|
5月前
|
域名解析 C++
C++ Qt开发:QHostInfo主机地址查询组件
在Qt网络编程中,QHostInfo是一个强大而灵活的组件,用于获取有关主机的信息,包括主机名、IP地址和域名解析等。通过支持异步查询的机制,它能够在后台获取主机信息,避免阻塞主线程,同时通过信号-槽机制提供查询结果。其多主机查询、可靠的错误处理和与网络环境的适应性,使其成为处理网络应用中主机信息获取的理想选择。
83 6
C++ Qt开发:QHostInfo主机地址查询组件
|
5月前
|
安全
Qt日志工具--QsLog
Qt日志工具--QsLog
132 1
|
12月前
QT项目实战(视频播放器)
QT项目实战(视频播放器)
277 0
下一篇
无影云桌面