134 lines
3.8 KiB
C
134 lines
3.8 KiB
C
|
|
#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
|