專案實戰:Qt球機控制工具 v1.0.0(球機運動八個方向以及運動速度,設定運動到指定角度,查詢當前水平和垂直角度)
阿新 • • 發佈:2021-11-25
需求
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);