需求
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 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