#ifndef CHASSIS_CAN_MSG_H #define CHASSIS_CAN_MSG_H #include /* 强制 1 字节对齐,完美匹配物理总线上的 8 字节数据帧 */ #pragma pack(push, 1) /* ========================================================= * TX: 上位机 (H743) -> 底盘 (F407) * ========================================================= */ /** * @brief 0x100 速度控制帧 (建议 20ms 发送周期) [cite: 608-612, 624] */ typedef struct { int16_t vx_x1000; // Byte 0-1: 线速度 m/s * 1000 (小端) [cite: 612] int16_t wz_x1000; // Byte 2-3: 角速度 rad/s * 1000 (小端) [cite: 612] uint8_t ctrl_flags; // Byte 4: 控制标志位 [cite: 612] uint8_t reserved; // Byte 5: 预留,固定填 0 [cite: 612] uint8_t rolling_counter; // Byte 6: 滚动计数器 (新counter相对上一帧差值必须在1..3之间) [cite: 612, 622] uint8_t crc8; // Byte 7: 对 Byte0~6 做的 CRC8-SAE J1850 [cite: 612] } CanMsg_CmdVel_0x100_t; /* ========================================================= * RX: 底盘 (F407) -> 上位机 (H743) * ========================================================= */ /** * @brief 0x181 底盘状态帧 (20ms 发送周期) [cite: 633-637] */ typedef struct { uint8_t system_state; // Byte 0: 0=BOOTING, 1=OPERATIONAL, 2=SAFE_FAULT [cite: 636, 665] uint8_t system_health; // Byte 1: 0=OK, 1=WARNING, 2=FAULT [cite: 636, 667] uint32_t diag_bits; // Byte 2-5: 诊断位图 (小端) [cite: 637, 669] uint8_t cmd_age_10ms; // Byte 6: 距最近一次合法 0x100 过去多少个 10ms [cite: 637] uint8_t status_counter; // Byte 7: 状态帧发送计数器 [cite: 637] } CanMsg_Status_0x181_t; /** * @brief 0x200 里程增量帧 (约 60ms 轮询周期) [cite: 655-658] * @note 这是时间窗内的脉冲增量,上位机需自行累加积分以推算里程 [cite: 660-662] */ typedef struct { int16_t fl_delta_ticks; // Byte 0-1: 左前轮增量 [cite: 658] int16_t rl_delta_ticks; // Byte 2-3: 左后轮增量 [cite: 658] int16_t fr_delta_ticks; // Byte 4-5: 右前轮增量 [cite: 658] int16_t rr_delta_ticks; // Byte 6-7: 右后轮增量 [cite: 658] } CanMsg_OdomDelta_0x200_t; /** * @brief 0x184 通信诊断帧 (100ms 发送周期) [cite: 651-653] */ typedef struct { uint8_t valid_cmd_total; // Byte 0: 合法命令累计 [cite: 653] uint8_t crc_error_total; // Byte 1: CRC 错误累计 [cite: 653] uint8_t counter_reject_total; // Byte 2: Counter 拒收累计 [cite: 653] uint8_t can_tx_drop_total; // Byte 3: CAN 发送丢帧累计 [cite: 653] uint8_t busoff_total; // Byte 4: Bus-Off 累计 [cite: 653] uint8_t rx_overrun_total; // Byte 5: FIFO overrun 累计 [cite: 653] uint8_t last_accepted_counter; // Byte 6: 最近一次接受的 counter [cite: 653] uint8_t err_nibbles; // Byte 7: 高4位=连续counter错,低4位=连续CRC错 [cite: 653] } CanMsg_CommDiag_0x184_t; #pragma pack(pop) #endif // CHASSIS_CAN_MSG_H