【项目实战(Qt球机控制工具 v1.0.0(球机运动八个方向以及运动速度,设置运动到指定角度,查询当前)】一年好景君须记,最是橙黄橘绿时。这篇文章主要讲述项目实战:Qt球机控制工具 v1.0.0(球机运动八个方向以及运动速度,设置运动到指定角度,查询当前相关的知识,希望能为你提供帮助。
需求
1.调试球机控制,方向速度,设置到指定的角度;
2.支持串口,485等基于串口的协议端口配置打开;
3.子线程串口控制和.子线程协议解析;
4.支持球机水平运动速度、垂直运动速度设置;
5.支持球机运动八个方向:上、右上、右、右下、下、左下、左、左上;
6.支持变倍缩放;
7.支持变焦距(球机自动对焦则无效)
8.光圈(球机支持才行)
9.显示当前球机角度;
10.设置球机运动到指定的水平位置;
11.设置球机运动到指定的垂直位置;
<
br>
注意
有的球机运动以及一些其他控制指令没有协议返回,理论上有返回,但是球机无返回只有查询协议有返回)。
<
br>
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_OBJECTpublic:
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 - releaseprotected:
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
< br>
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121512987
推荐阅读
- gitlab关闭注册功能
- PostgreSQL 数据库常用操作
- 即使调用get_header(),也无法通过页面模板访问wordpress header.php中包含的文件
- 在Chrome和Chrome上预先登录WordPress主题(avada)时出错
- 致命错误(找不到类”WP_Customize_Control”)
- 加载资源失败(服务器响应,状态为404 Not Found)
- WordPress自定义帖子中面临错误
- WP排除多个页面模板
- 在相关的Post WordPress中排除草稿发布