Files
QT_wuhan_YT/comm/uart.h
T
2026-10-14 18:22:41 +08:00

73 lines
2.6 KiB
C++

#ifndef UART_H
#define UART_H
#include <QByteArray>
#include <QObject>
#include <QTimer>
#include <QMetaType>
#include <QString>
class QSerialPort;
// ===================== 遥控器帧(24 字节二进制协议) =====================
// 周期 100ms,1 字节对齐,多字节字段小端。
// BYTE0=0x11 帧头,BYTE22=0x22 帧尾,BYTE23 = BYTE0~BYTE22 之和的低 8 位。
// 本结构只承载解析结果,不含任何控制策略。
struct RcFrame {
// BYTE1 控制模式与使能标志位
bool driveMode = false; // bit0 行车模式
bool armMode = false; // bit1 机械臂模式
bool armEnabled = false; // bit2 机械臂使能
bool chassisEnabled = false; // bit3 底盘使能
bool estop = false; // bit4 急停
// 摇杆量:0~4096,中位 2048
int gear = 2048; // BYTE3-4 整车档位(底盘模式-左摇杆 Y 轴)
int steer = 2048; // BYTE5-6 整车转向(底盘模式-左摇杆 X 轴)
int posZ = 2048; // BYTE7-8 末端位置上下(左摇杆 Z 轴)
int posX = 2048; // BYTE9-10 末端位置左右(左摇杆 X 轴)
int posY = 2048; // BYTE11-12 末端位置前后(左摇杆 Y 轴)
int roll = 2048; // BYTE13-14 末端姿态横滚(右摇杆 X 轴)
int pitch = 2048; // BYTE15-16 末端姿态俯仰(右摇杆 Y 轴)
int yaw = 2048; // BYTE17-18 末端姿态偏航(右摇杆 Z 轴)
int battery = 0; // BYTE19 遥控器电量 0~100
};
Q_DECLARE_METATYPE(RcFrame)
// ===================== 遥控器串口接收层 =====================
// 独占 rc/device(默认 /dev/ttyS7),115200 / 8 数据位 / 1 停止位 / 无校验。
// 只负责收包、校验、解析与链路超时判定,不决定遥控器数据的用途。
class RcCommunication : public QObject
{
Q_OBJECT
public:
explicit RcCommunication(QObject* parent = nullptr);
~RcCommunication() override;
bool start();
void stop();
QString deviceName() const { return m_device; }
bool linkOk() const { return m_linkOk; }
signals:
void frameReceived(const RcFrame& frame); // 收到一帧合法报文
void linkChanged(bool ok); // 链路状态变化
private slots:
void onReadyRead();
void onLinkTimeout();
private:
void onFrame(const RcFrame& frame);
QSerialPort* m_serial = nullptr;
QByteArray m_buf; // 串口是字节流,粘包/拆包在此缓冲里重新对齐
QTimer* m_linkTimer = nullptr;
QString m_device = "/dev/ttyS7";
int m_baud = 115200;
bool m_linkOk = false;
};
#endif // UART_H