需求

  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. [转帖]VMWare ESXi中,不同的虚拟网卡性能竟然能相差三倍!

    https://zhuanlan.zhihu.com/p/525656364 正文共:1024 字 11 图,预估阅读时间:1 分钟 在上个实验中(VPP使用DPDK纳管主机网卡),我们已经初步实现了 ...

  2. 国产CPU制造工艺与部分性能总结

    国产CPU制造工艺与部分性能总结 背景 最近一段时间验证了很多国产CPU的性能. 感觉很多地方与之前的理解有一些偏差. 前几天总结了部分架构和指令集相关的差异 今天想着总结一下制造相关的部分. 希望能 ...

  3. zabbix 6.0 官方文档

    Choose your platform   ZABBIX VERSION 6.0 LTS 5.4 5.0 LTS 4.0 LTS OS DISTRIBUTION Red Hat Enterprise ...

  4. 【k哥爬虫普法】程序员183并发爬取官方网站,直接获刑3年?

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  5. 快捷方式 ABP——切换MySQL数据库

    当基于ABP开发一段时间后,切换数据库可以使用快捷方式 方法如下: 第一步: 前提是要知道所使用的数据库的版本 1. vs 2017需要点击XXX.XXX.EntityFrameworkCore,右键 ...

  6. 新建立git分支,之后将分支合并到master上

    1.打开PowerShell 进入解决方案中的文件夹中,并列出目前远程的所有分支 命令:git branch -a 2.从远程获取最新版本到本地 命令:git fetch --all 3.使本地代码与 ...

  7. DotLiquid(.net模版引擎)

    可用生成C#代码,在KSFramework中有使用:https://github.com/mr-kelly/KSFramework 主页:http://dotliquidmarkup.org/ 文档: ...

  8. React中引入外部js文件

    假设需要引入本地的一个jquery库: <script src="http://127.0.0.1:8080/plugins/jquery.min.js" type=&quo ...

  9. 小米WIFI 7路由器BE6500 Pro开箱

    上次发帖与坛子里的网友们聊了小米的这款路由,正好今天拿到货了,所以来个开箱图,让其他彦祖们也见识见识小米家的路由产品. 以前买过小米家的路由器,但是当时就是买来尝鲜,这次咋的也是对WIFI 7的尝鲜吧 ...

  10. Linux-crontab的使用

    一.什么是crontab?crontab 是有cron (crond) 这个系统服务来控制的,cron服务是linux的内置服务,类似于window下的计划任务,但它不会开机自动启动 二.如何使用?c ...