GrabBag/GrabBagApp/Presenter/Inc/SerialProtocol.h

134 lines
3.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef SERIALPROTOCOL_H
#define SERIALPROTOCOL_H
#include <functional>
#include <vector>
#include <string>
#include <QTimer>
#include <QObject>
#include "ProtocolCommon.h"
#include <QSerialPort>
#include <QSerialPortInfo>
/**
* @brief 串口协议封装类
* 提供串口通信、协议解析、机械臂坐标发送等功能
*/
class SerialProtocol : public QObject
{
Q_OBJECT
public:
/**
* @brief 串口连接状态枚举(使用公共状态定义)
*/
using SerialStatus = ConnectionStatus;
public:
SerialProtocol(QObject* parent = nullptr);
~SerialProtocol();
/**
* @brief 打开串口连接
* @param portName 串口名称如COM1, /dev/ttyUSB0等
* @param baudRate 波特率
* @param dataBits 数据位 (5, 6, 7, 8)
* @param stopBits 停止位 (1, 2)
* @param parity 校验位 (0-无校验, 1-奇校验, 2-偶校验)
* @param flowControl 流控制 (0-无, 1-硬件, 2-软件)
* @return 0-成功,其他-错误码
*/
int OpenSerial(const std::string& portName, int baudRate = 9600,
int dataBits = 8, int stopBits = 1, int parity = 0, int flowControl = 0);
/**
* @brief 关闭串口连接
*/
void CloseSerial();
/**
* @brief 发送多目标检测结果数据
* 协议格式:$,DATA,NUM,posX,posY,posZ,posC,posX,posY,posZ,posC...,#
* @param multiTargetData 多目标数据结构
* @param cameraId 相机ID从1开始编号
* @return 0-成功,其他-错误码
*/
int SendMultiTargetData(const MultiTargetData& multiTargetData, uint16_t cameraId);
/**
* @brief 获取当前串口连接状态
* @return 当前状态
*/
SerialStatus GetSerialStatus() const;
/**
* @brief 设置连接状态回调
* @param callback 回调函数
*/
void SetConnectionCallback(const ConnectionCallback& callback);
/**
* @brief 设置工作信号回调
* @param callback 回调函数
*/
void SetWorkSignalCallback(const WorkSignalCallback& callback);
/**
* @brief 获取串口是否已打开
* @return true-已打开false-未打开
*/
bool IsOpen() const;
private slots:
/**
* @brief 串口数据接收槽函数
*/
void OnSerialDataReceived();
/**
* @brief 串口错误处理槽函数
* @param error 错误类型
*/
void OnSerialError(QSerialPort::SerialPortError error);
private:
/**
* @brief 解析接收到的协议数据
* @param data 接收到的数据
*/
void ParseProtocolData(const QString& data);
/**
* @brief 发送数据到串口
* @param data 要发送的数据
* @return 0-成功,其他-错误码
*/
int SendData(const std::string& data);
/**
* @brief 构造数据协议字符串
* @param multiTargetData 多目标数据
* @param cameraId 相机ID
* @return 协议字符串
*/
std::string BuildDataProtocol(const MultiTargetData& multiTargetData, uint16_t cameraId);
private:
QSerialPort* m_pSerialPort; // 串口对象
SerialStatus m_serialStatus; // 串口状态
QString m_receiveBuffer; // 接收缓冲区
// 回调函数
ConnectionCallback m_connectionCallback; // 连接状态回调
WorkSignalCallback m_workSignalCallback; // 工作信号回调
// 协议常量
static const QString PROTOCOL_START; // 协议开始标识 "$"
static const QString PROTOCOL_END; // 协议结束标识 "#"
static const QString CMD_START; // 开始命令 "START"
static const QString CMD_DATA; // 数据命令 "DATA"
static const QString SEPARATOR; // 分隔符 ","
};
#endif // SERIALPROTOCOL_H