需求

  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

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

  1. 项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)

    需求   在整理文件和一些其他头文件的时候,需要对其名称进行整理和修改,此工具很早就应该写了,创业后,非常忙,今天抽空写了一个顺便提供给学习.   工具和源码下载地址   本篇文章的应用包和源码包可在 ...

  2. AJ学IOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件

    AJ分享,必须精品 一:效果 二:封装好的工具条 NYComposeToolbar.h 带代理方法 #import <UIKit/UIKit.h> typedef enum { NYCom ...

  3. 今日头条、抖音、西瓜、火山、微视、陌陌等自媒体平台小视频批量下载工具v1.1.0(视频搬运福利)

    前言 目前各大自媒体平台爆火,网络流量暴涨,各大自媒体平台的小视频为广大个广告主带来了如泉涌般的的视频流量,更给广大的自媒体小编带来了丰厚的利益回报,想要创做更多的自媒体内容着实不易,下面给广大的小视 ...

  4. Blend打不开wpf项目,提示无法识别的工具版本“12.0”

          讲项目文件用记事本打开然后修改为“14.0”即可        

  5. Android项目实战(四十):Andoird 7.0+ 安装APK适配

    首先看一下安装apk文件的代码 /** * 通过隐式意图调用系统安装程序安装APK */ public static void install(Context context) { Intent in ...

  6. Android项目实战(四十九):Andoird 7.0+相机适配

    解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...

  7. 【笔记目录2】ASP.NET Core分布式项目实战

    当前标签: ASP.NET Core分布式项目实战 共2页: 上一页 1 2  11.ClientCredential模式总结 GASA 2019-03-11 12:59 阅读:26 评论:0 10. ...

  8. 项目实战15—企业级堡垒机 jumpserver

    本文收录在Linux运维企业架构实战系列 环境准备 系统:CentOS 7 IP:192.168.10.101 关闭selinux 和防火墙 # CentOS $ setenforce # 可以设置配 ...

  9. 项目实战15.1—企业级堡垒机 jumpserver一步一步搭建

    本文收录在Linux运维企业架构实战系列 环境准备 系统:CentOS 7 IP:192.168.10.101 关闭selinux 和防火墙 # CentOS 7 $ setenforce 0 # 可 ...

  10. 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

随机推荐

  1. Python学习之九_winrm执行远程机器的cmd命令

    Python学习之九_winrm执行远程机器的cmd命令 winrm # 注意如下命令需要按照顺序执行. # 打开powershell的管理员模式进行如下的操作. set-executionpolic ...

  2. 公司内部自建DNS的办法 使用私有域名的方法

    最近总是有一个需求,需要自己弄一些服务器域名之类的. 修改hosts总是比较麻烦,所以想了一个简单办法, 自己搭建一个dns服务器, 本来想用最简单的 dnsmasq 但是发现总是不成功, 然后找了另 ...

  3. ChaosMesh 半离线安装过程

    说明 所谓半离线值得是公司拉不下镜像来 !-_-! 都是学习的官网资料https://chaos-mesh.org/docs 镜像获取 其实镜像获取很容易. 找一个能上外网的VPC就可以了. mkdi ...

  4. 在WPF应用中实现DataGrid的分组显示,以及嵌套明细展示效果

    我在前面随笔<在Winform系统开发中,对表格列表中的内容进行分组展示>,介绍了Winform程序中对表格内容进行了分组的展示,在WPF应用中,同样也可以对表格的内容进行分组展示,不过处 ...

  5. echarts去掉y轴线、设置x轴线的颜色、x轴文字颜色

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 像elementui一样封装自定义按钮

    <template> <div> <button @click.prevent="coverHandler" class="btn-btn& ...

  7. 【0基础学爬虫】爬虫基础之自动化工具 Pyppeteer 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...

  8. P7036 [NWRRC2016] Folding

    题目简述 有两个矩形,大小分别是 \(W \times Y\) 和 $ w \times y$.现在我们要通过折叠将两个矩阵变成一样. 思路 part1 已知一条边折叠一次会变成 \(\frac{x} ...

  9. 通过docker-compose搭建mongo的replica set高可用

    通过docker-compose搭建mongo的replica set高可用 前言 备份数据 备份数据到本地 数据恢复 集群搭建 生成keyFile 创建yml文件 初始化副本集 增加副本集 将节点初 ...

  10. 《重学Java设计模式》作者开始录视频了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 1. 前言 哈哈哈,终于对B站下手了! 大家好,我是小傅哥,在紧张.羞涩到适应后,哈哈哈,终于 ...