增加通讯协议
This commit is contained in:
+73
@@ -0,0 +1,73 @@
|
||||
#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/ttyS5),115200 / 8 数据位 / 1 停止位 / 无校验,
|
||||
// 与车端 /dev/ttyS7(见 car.h)互不干扰。
|
||||
// 只负责收包、校验、解析与链路超时判定,不决定遥控器数据的用途。
|
||||
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
|
||||
Reference in New Issue
Block a user