#ifndef _INTERFACE_H_ #define _INTERFACE_H_ #include "stdint.h" #include "app_config.h" // 假设包含基础配置和宏定义 #include "interface_config.h" #include "debug.h" #pragma pack(1)//数据结构一个字节对齐 #define request_read_id un_request_frame.bit_data.request_id//读取ID #define request_header_id un_request_frame.bit_data.frame_header//帧头 #define FAULT 0 #define NORMAL 1 #define NMEA_BUF_SIZE 128 #define RX_BUFFER_LEN 1400 #define IMU_LEN 90 #define IMU_FRAME_LEN 42 typedef struct StrInfNavigationOutput { uint16_t frame_header; // 帧头 固定值0xAACC uint16_t frame_type; // 帧类型 固定值0x0027 uint16_t frame_length; // 帧长 固定值49 uint8_t accumulated; // 累加值 按帧累加 /* 陀螺仪数据 (6字节) */ int16_t gyroscope_x_axis; // 陀螺X轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s int16_t gyroscope_y_axis; // 陀螺Y轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s int16_t gyroscope_z_axis; // 陀螺Z轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s /* 加速度计数据 (6字节) */ int16_t acceleration_x_axis; // 加表X轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g int16_t acceleration_y_axis; // 加表Y轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g int16_t acceleration_z_axis; // 加表Z轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g /* 磁力计数据 (6字节) */ int16_t magnetic_x_axis; // 磁力计X轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT int16_t magnetic_y_axis; // 磁力计Y轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT int16_t magnetic_z_axis; // 磁力计Z轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT /* 定位数据 (12字节) */ int32_t lon; // 经度 | 偏移量0 | 实际值=原始值×1e-7+0 | 单位:deg int32_t lat; // 纬度 | 偏移量0 | 实际值=原始值×1e-7+0 | 单位:deg int32_t high; // 高度 | 偏移量0 | 实际值=原始值×1e-3+0 | 单位:m /* 导航数据 (11字节) */ uint8_t rtk_state; // RTK状态 | 偏移量0 | 0=不定位,1=单点,2=DGPS,4=RTK固定解,5=RTK浮点解 int16_t gps_speed; // GPS速度 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:m/s int16_t car_speed; // 车速 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:m/s int16_t dual_antenna_heading; // 双天线航向 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:度 int32_t time; // 时间 | 偏移量0 | 实际值=原始值/4000+0 | 单位:秒 /* 校验位 (1字节) */ uint8_t crc1; // CRC按照字节来接,取低8位 | 偏移量0 } StrInfNavigationOutput; typedef union _UnInfNavigationOutput { StrInfNavigationOutput bit_data; // 使用定义的结构体变量名 unsigned char arr[sizeof(StrInfNavigationOutput)]; // 通过结构体类型确定大小 } UnInfNavigationOutput; typedef struct { /* 帧头 (3字节) */ // uint8_t header[3]; // 固定值0xBD 0xDB 0x0B uint8_t header1; // 固定值0xBD 0xDB 0x0B uint8_t header2; // 固定值0xBD 0xDB 0x0B uint8_t header3; // 固定值0xBD 0xDB 0x0B /* 姿态数据 (6字节) */ int16_t roll; // 横滚角 实际值=原始值×(360/32768) 单位:deg int16_t pitch; // 俯仰角 实际值=原始值×(360/32768) 单位:deg int16_t yaw; // 方位角 实际值=原始值×(360/32768) 单位:deg /* 陀螺仪数据 (6字节) */ int16_t gyro_x; // 陀螺X轴 实际值=原始值×(300/32768) 单位:deg/s int16_t gyro_y; // 陀螺Y轴 实际值=原始值×(300/32768) 单位:deg/s int16_t gyro_z; // 陀螺Z轴 实际值=原始值×(300/32768) 单位:deg/s /* 加速度计数据 (6字节) */ int16_t accel_x; // 加表X轴 实际值=原始值×(12/32768) 单位:g int16_t accel_y; // 加表Y轴 实际值=原始值×(12/32768) 单位:g int16_t accel_z; // 加表Z轴 实际值=原始值×(12/32768) 单位:g /* 定位数据 (12字节) */ int32_t latitude; // 纬度 实际值=原始值×1e-7 单位:deg int32_t longitude; // 经度 实际值=原始值×1e-7 单位:deg int32_t altitude; // 高度 实际值=原始值×1e-3 单位:m /* 速度数据 (6字节) */ int16_t velocity_north; // 北向速度 实际值=原始值×(100/32768) 单位:m/s int16_t velocity_east; // 东向速度 实际值=原始值×(100/32768) 单位:m/s int16_t velocity_down; // 地向速度 实际值=原始值×(100/32768) 单位:m/s /* 状态数据 (5字节) */ uint8_t init_status; // Bit0:位置 Bit1:速度 Bit2:俯仰/横滚 Bit3:航向 (1=完成初始化) uint8_t rtk_status; // 0:不定位 1:单点 2:DGPS 4:RTK固定解 5:RTK浮点解 uint8_t reserved[3]; // 预留字节 /* 导航数据 (10字节) */ uint16_t nav_status; // 导航状态位 (包含50、51、62等状态) int16_t gps_speed; // GPS速度 实际值=原始值×0.01 单位:m/s int16_t vehicle_speed; // 车速 实际值=原始值×0.01 单位:m/s uint16_t dual_heading; // 双天线航向 实际值=原始值×0.01 单位:度 uint32_t timestamp; // 时间 实际值=原始值/4000 单位:秒 /* 类型和校验 (2字节) */ uint8_t data_type; // 数据类型 uint8_t checksum; // 异或校验 (0~56字节) } StrInfNavigationRS232Output; typedef union { StrInfNavigationRS232Output bit_data; uint8_t arr[sizeof(StrInfNavigationRS232Output)]; } UnInfNavigationRS232Output; typedef struct StrInfNavigationOutputC { uint16_t frame_header; // 帧头 固定值0xAACC uint16_t frame_type; // 帧类型 固定值0x0027 uint16_t frame_length; // 帧长 固定值49 uint8_t accumulated; // 累加值 按帧累加 /* 陀螺仪数据 (6字节) */ int16_t gyroscope_x_axis; // 陀螺X轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s int16_t gyroscope_y_axis; // 陀螺Y轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s int16_t gyroscope_z_axis; // 陀螺Z轴 | 偏移量0 | 实际值=原始值×(300/32768)+0 | 单位:deg/s /* 加速度计数据 (6字节) */ int16_t acceleration_x_axis; // 加表X轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g int16_t acceleration_y_axis; // 加表Y轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g int16_t acceleration_z_axis; // 加表Z轴 | 偏移量0 | 实际值=原始值×(12/32768)+0 | 单位:g /* 四元数 (16字节) */ uint32_t q0; // 四元数标量分量(w) | 存储值=实际值×1e6 | 偏移量0 | 精度:±0.000001 | 无量纲 uint32_t q1; // 四元数向量分量(x) | 存储值=实际值×1e6 | 偏移量0 | 精度:±0.000001 | 无量纲 uint32_t q2; // 四元数向量分量(y) | 存储值=实际值×1e6 | 偏移量0 | 精度:±0.000001 | 无量纲 uint32_t q3; // 四元数向量分量(z) | 存储值=实际值×1e6 | 偏移量0 | 精度:±0.000001 | 无量纲 /* 磁力计数据 (6字节) */ int16_t magnetic_x_axis; // 磁力计X轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT int16_t magnetic_y_axis; // 磁力计Y轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT int16_t magnetic_z_axis; // 磁力计Z轴 | 偏移量0 | 实际值=原始值×1+0 | 单位:uT /* 定位数据 (12字节) */ int32_t lon; // 经度 | 偏移量0 | 实际值=原始值×1e-7+0 | 单位:deg int32_t lat; // 纬度 | 偏移量0 | 实际值=原始值×1e-7+0 | 单位:deg int32_t high; // 高度 | 偏移量0 | 实际值=原始值×1e-3+0 | 单位:m /* 导航数据 (11字节) */ uint8_t rtk_state; // RTK状态 | 偏移量0 | 0=不定位,1=单点,2=DGPS,4=RTK固定解,5=RTK浮点解 int16_t gps_speed; // GPS速度 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:m/s int16_t car_speed; // 车速 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:m/s int16_t dual_antenna_heading; // 双天线航向 | 偏移量0 | 实际值=原始值×0.01+0 | 单位:度 int32_t time; // 时间 | 偏移量0 | 实际值=原始值/4000+0 | 单位:秒 /* 校验位 (1字节) */ uint8_t crc1; // CRC按照字节来接,取低8位 | 偏移量0 } StrInfNavigationOutputC; typedef union _UnInfNavigationOutputC { StrInfNavigationOutputC bit_data; // 使用定义的结构体变量名 unsigned char arr[sizeof(StrInfNavigationOutputC)]; // 通过结构体类型确定大小 } UnInfNavigationOutputC; /* 车辆轮速输入数据结构体 */ typedef struct { /* 四轮速度数据 (8字节) */ int16_t front_left_speed; // 左前轮速 单位:km/h int16_t front_right_speed; // 右前轮速 单位:km/h int16_t rear_left_speed; // 左后轮速 单位:km/h int16_t rear_right_speed; // 右后轮速 单位:km/h } StrVehicleWheelSpeedInput; /* 轮速数据联合体(用于原始字节访问) */ typedef union { StrVehicleWheelSpeedInput speed_data; // 结构化轮速数据 uint8_t arr[sizeof(StrVehicleWheelSpeedInput)]; // 原始字节数组 } UnWheelSpeedInput; typedef enum { NMEA_TYPE_UNKNOWN = 0, // 未确定 NMEA_TYPE_GGA, // GGA协议 NMEA_TYPE_VTG, // VTG协议 NMEA_TYPE_THS // THS协议 } NMEA_FrameType; typedef struct StrInfNMEAOutput { char buffer[NMEA_BUF_SIZE]; NMEA_FrameType frame_ready; // 0:未确定 1:GGA 2:VTG 3:THS } StrInfNMEAOutput; // 接收请求帧 typedef struct _StrRequestFrame { //-------------------------------------------------- unsigned int frame_header : 16; // 帧头 固定值0x0080 unsigned int frame_type : 16; // 帧类型 固定值0x0029 unsigned int frame_length : 16; // 帧长 固定值10 unsigned int accumulated : 8; // 累加值 按帧累加 unsigned int request_id : 16; // 请求帧ID 请求ID 0-FFFF,FFFF表示全部帧 unsigned int crc : 8; // CRC 按字节累加之和 取低8位 } StrRequestFrame; typedef union _UnRequestFrame { StrRequestFrame bit_data; // 使用定义的结构体变量名 unsigned char arr[sizeof(StrRequestFrame)]; // 通过结构体类型确定大小 } UnRequestFrame; // 接收请求帧 typedef struct _StrRequestMessage { uint8_t ip_adesser[8]; // IP地址 uint16_t port; } StrRequestMessage; // typedef struct { // uint8_t data_id; // uint8_t data_len; // uint8_t data[4]; // }YisDateFrame; typedef enum{ init = 0, uart, ethernet, }rtcm_type; typedef struct { uint8_t dma_buffer[2][RX_BUFFER_LEN]; // 双缓冲 volatile uint8_t active_buf; // 当前活跃缓冲区索引 volatile uint16_t buf_len; // 当前活跃缓冲区索引 volatile rtcm_type type; // 串口或者以太网 volatile uint8_t eth_cnt; // 当前活跃缓冲区索引 } rtcmBuffer; typedef enum{ IIM46234 = 0, YIS321, }imu_type; typedef struct { uint8_t dma_buffer[2][IMU_LEN]; // 双缓冲 volatile uint8_t active_buf; // 当前活跃缓冲区索引 volatile uint16_t buf_len; // 当前活跃缓冲区索引 volatile imu_type type; // 类型 } imuBuffer; //外部数据结构声明 // 设置输出加速度角速度数据 extern uint8_t set_output_data[20]; // 设定输出频率 extern uint8_t set_rate[20]; // 保存配置 extern uint8_t save_cmd[20]; // 进入流控模式,输出数据 extern uint8_t stream_cmd[20]; //变量 extern uint8_t test_app[26]; // 设置输出加速度角速度数据 extern uint8_t set_output_data[20]; // 设定输出频率 extern uint8_t set_rate[20]; // 保存配置 extern uint8_t save_cmd[20]; // 进入流控模式,输出数据 extern uint8_t stream_cmd[20]; extern UnInfNavigationOutput navigation_output1; extern UnInfNavigationOutput navigation_output2; extern UnInfNavigationOutputC navigation_outputC1; extern StrInfNMEAOutput nema_output1 ; extern UnInfNavigationRS232Output navigation_rs232_output;//串口输出数据 extern UnRequestFrame un_request_frame;//请求帧 extern StrRequestMessage str_RequestMessage;//请求信息 extern rtcmBuffer RTCM_Buffer1; extern imuBuffer imu_buffer1; //函数 void canSendAll(void *signal_id); void ethernetSendAll(void *signal_id); #pragma pack() #endif /* _INTERFACE_H_ */