165 lines
4.7 KiB
C++
165 lines
4.7 KiB
C++
#ifndef SERIALPROTOCOL_H
|
||
#define SERIALPROTOCOL_H
|
||
|
||
#include <functional>
|
||
#include <vector>
|
||
#include <string>
|
||
#include <QTimer>
|
||
#include <QObject>
|
||
#include <QThread>
|
||
#include <QMutex>
|
||
#include <QMutexLocker>
|
||
#include <atomic>
|
||
#include <thread>
|
||
#include <mutex>
|
||
#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);
|
||
|
||
/**
|
||
* @brief 阻塞式串口数据接收线程函数
|
||
*/
|
||
void SerialReceiveThreadFunction();
|
||
|
||
/**
|
||
* @brief 启动串口接收线程
|
||
*/
|
||
void StartReceiveThread();
|
||
|
||
/**
|
||
* @brief 停止串口接收线程
|
||
*/
|
||
void StopReceiveThread();
|
||
|
||
/**
|
||
* @brief 处理接收到的数据(线程安全)
|
||
*/
|
||
void ProcessReceivedData();
|
||
|
||
private:
|
||
QSerialPort* m_pSerialPort; // 串口对象
|
||
SerialStatus m_serialStatus; // 串口状态
|
||
QString m_receiveBuffer; // 接收缓冲区
|
||
|
||
// 线程相关
|
||
std::thread m_receiveThread; // 接收线程
|
||
std::atomic<bool> m_threadRunning; // 线程运行标志
|
||
std::mutex m_bufferMutex; // 缓冲区互斥锁
|
||
|
||
// 回调函数
|
||
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
|