• 项目实战: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 PROTOCOLPALCODMANAGER_H
    #define PROTOCOLPALCODMANAGER_H
    
    /**********************************************************************\
     * 类名: ProtocolPelcoDManager
     * 说明: pelco-D协议组装和解析类
     * 线程函数:
     *          void slot_start() -- 开始运行
     *          void slot_stop() -- 停止运行
     * 著作权信息
     *      作者:红胖子(AAA红模仿)
     *      公司:长沙红胖子网络科技有限公司
     *      网址:hpzwl.blog.csdn.net
     *      联系方式:QQ(21497936) 微信(yangsir198808) 电话(15173255813)
     * 版本信息
     *       日期             版本           描述
     *    2021年11月24日     v1.0.0         基础功能
    \**********************************************************************/
    
    #include <QObject>
    #include <QMutex>
    #include <QJsonArray>
    #include <QJsonObject>
    #include <QJsonDocument>
    #include <QDebug>
    #include <QDateTime>
    
    
    class ProtocolPelcoDManager : public QObject
    {
        Q_OBJECT
    public:
        enum EVENT_TYPE {
            EVENT_TYPE_HORIZAL_ANGLE = 0x00,
            EVENT_TYPE_VERTICAL_ANGLE,
        };
    
    private:
        explicit ProtocolPelcoDManager(QObject *parent = 0);
    
    public:
        static ProtocolPelcoDManager *getInstance();    // 获取实例
    
    public:
        int getAddr() const;
    
    public:
        void setAddr(int addr);
    
    signals:
        void signal_event(ProtocolPelcoDManager::EVENT_TYPE eventType, double value);
    
    public:                     // 移动方向指令: 上、下、左、右
        QByteArray constructMoveUpProtocol   (int verticalSpeed = 0x20, int addr = -1);
        QByteArray constructMoveRightProtocol(int horizalSpeed  = 0x20, int addr = -1);
        QByteArray constructMoveDownProtocol (int verticalSpeed = 0x20, int addr = -1);
        QByteArray constructMoveLeftProtocol (int horizalSpeed  = 0x20, int addr = -1);
                                // 移动方向指令:左上、左下、右上、右下
        QByteArray constructMoveRightUpProtocol  (int horizalSpeed = 0x20, int verticalSpeed = 0x20, int addr = -1);
        QByteArray constructMoveRightDownProtocol(int horizalSpeed = 0x20, int verticalSpeed = 0x20, int addr = -1);
        QByteArray constructMoveLeftDownProtocol (int horizalSpeed = 0x20, int verticalSpeed = 0x20, int addr = -1);
        QByteArray constructMoveLeftUpProtocol   (int horizalSpeed = 0x20, int verticalSpeed = 0x20, int addr = -1);
                                // 变倍小、大
        QByteArray constructZoomWideProtocol(int addr = -1);
        QByteArray constructZoomTeleProtocol(int addr = -1);
                                // 聚焦近、远
        QByteArray constructFocusNearProtocol(int addr = -1);
        QByteArray constructFocusFarWideProtocol(int addr = -1);
                                // 光圈开、关
        QByteArray constructIrisOpenProtocol(int addr = -1);
        QByteArray constructIrisCloseProtocol(int addr = -1);
                                // 查询水平角度、垂直角度
        QByteArray constructQueryHorizalProtocol(int addr = -1);
        QByteArray constructQueryVerticalProtocol(int addr = -1);
                                // 设置水平角度、垂直角度
        QByteArray constructSetHorizalProtocol(double angle, int addr = -1);
        QByteArray constructSetVerticalProtocol(double angle, int addr = -1);
    
    public:
        QByteArray constructStopProtocol(int addr = -1);
    
    public slots:
        void slot_start();                              // 线程开始
        void slot_stop();                               // 线程停止
    
    public slots:
        void slot_recvProtocol(QByteArray byteArray);   // 协议接收入口
    
    public:
        static void sendProtocol(QByteArray byteArray); // 发送协议(目前为空,根据使用时是否绑定串口设计)
    
    protected:
        QByteArray constructCtrlProtocol(char addr, char cmnd1, char cmnd2, char horizalSpeed, char veritalSpeed);
    
    private:
        static ProtocolPelcoDManager *_pInstance;
        static QMutex _mutex;
    
    private:
        bool _running;                                  // 线程是否在运行
    
    private:
        int _addr;
    };
    
    #endif // PROTOCOLPALCODMANAGER_H
    
    
     

    若该文为原创文章,转载请注明原文出处
    本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121512987

  • 相关阅读:
    js常用工具函数
    vue-cli跨域问题解决
    charles抓包404问题(左侧不显示配置)
    vuex存储与本地储存(localstorage、sessionstorage)的区别(笔记)
    借助axios的拦截器实现Vue.js中登陆状态校验的思路(笔记)
    cornerstone使用注意点
    本地仓库连接远程仓库,git本地新建项目上传到远程git仓库上正确流程
    做一个不那么差的程序员
    解决 php Call to undefined function shm_attach()
    Redis 常用的数据结构
  • 原文地址:https://www.cnblogs.com/qq21497936/p/15601625.html
Copyright © 2020-2023  润新知