如果文章是原创文章,请注明原文的来源 博客地址:https://hpzwl.blog.csdn.net/article/details/121512987 红胖子(红模仿)博文全集:开发技术集合(包括Qt实用技术,树莓派,三维,OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等。…(点击传送门)
开发专栏:项目实战
需求
??1.调试球机控制,将方向速度设置到指定角度; ??2.支持串口、485等基于串口的协议端口配置; ??3.控制子线程串口.分析子线程协议; ??4.支持球机水平运动速度和垂直运动速度设置; ??5.支持球机运动的八个方向:上、右、右、右、右、下、左、左、左; ??6.支持变倍缩放; ??7.支持变焦距(球机自动对焦无效) ??8.光圈(球机支持) ??9.显示当前球机角度; ??10.将球机设置到指定的水平位置; ??11.将球机运动到指定的垂直位置;
注意
??有些球机运动等控制指令没有协议返回,理论上有返回,但球机没有返回,只有查询协议返回)。
Demo演示
??
??
??
下载调试工具的地址
??CSDN免积分下载:https://download.csdn.net/download/qq21497936/48131428 ??QQ群:(点击“”搜索“ ,群内与博文同步更新)
相关头文件
#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
#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
#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
#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