#ifndef UART_H #define UART_H #include #include #include #include #include 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 停止位 / 无校验。 // 车端 CAN 改走 UDP(见 car.h,收 9000 / 发 9001),不再占用串口。 // 只负责收包、校验、解析与链路超时判定,不决定遥控器数据的用途。 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