# GPS位置信息集成说明 ## 概述 GPS位置信息已成功集成到数据采集系统中。每个ADC数据包现在都包含对应的GPS时间和位置信息,实现了数据与地理位置的关联。 ## 数据包结构 ### CorrectedDataPacketWithGPS_t - 带GPS信息的校正数据包 ```c typedef struct __attribute__((packed)) { uint32_t start_byte; // 包头 (4字节) = 0xFFFFFFFF uint32_t timestamp; // 系统时间戳 (4字节) float corrected_x; // 校正后X轴数据 (4字节) float corrected_y; // 校正后Y轴数据 (4字节) float corrected_z; // 校正后Z轴数据 (4字节) // GPS信息 uint8_t gps_valid; // GPS数据有效标志 (1字节) 1=有效, 0=无效 uint8_t gps_hour; // GPS时间-时 (1字节) UTC时间 uint8_t gps_minute; // GPS时间-分 (1字节) uint8_t gps_second; // GPS时间-秒 (1字节) float gps_latitude; // GPS纬度 (4字节) 十进制度数 float gps_longitude; // GPS经度 (4字节) 十进制度数 float gps_altitude; // GPS海拔高度 (4字节) 米 uint8_t gps_satellites; // GPS卫星数量 (1字节) uint8_t reserved[3]; // 保留字节 (3字节) uint16_t checksum; // CRC16校验和 (2字节) uint16_t end_byte; // 包尾 (2字节) = 0x0000 } CorrectedDataPacketWithGPS_t; ``` **总大小**: 48字节 ### 数据包字段说明 #### 基本信息 - **start_byte**: 固定包头标识 `0xFFFFFFFF`,用于数据包同步 - **timestamp**: 系统时间戳(毫秒),从系统启动开始计时 - **corrected_x/y/z**: 经过校正算法处理后的三轴数据 #### GPS时间信息 - **gps_valid**: GPS数据有效性标志 - `1`: GPS数据有效,定位成功 - `0`: GPS数据无效或未定位 - **gps_hour**: UTC时间-小时 (0-23) - **gps_minute**: UTC时间-分钟 (0-59) - **gps_second**: UTC时间-秒 (0-59) #### GPS位置信息 - **gps_latitude**: 纬度(十进制度数) - 正值表示北纬,负值表示南纬 - 范围: -90.0 到 +90.0 - 示例: 39.9042 表示北纬39.9042° - **gps_longitude**: 经度(十进制度数) - 正值表示东经,负值表示西经 - 范围: -180.0 到 +180.0 - 示例: 116.4074 表示东经116.4074° - **gps_altitude**: 海拔高度(米) - 相对于海平面的高度 - 示例: 50.5 表示海拔50.5米 - **gps_satellites**: 当前使用的卫星数量 - 通常需要至少4颗卫星才能定位 - 卫星数量越多,定位精度越高 #### 数据完整性 - **checksum**: CRC16-MODBUS校验和,用于验证数据完整性 - **end_byte**: 固定包尾标识 `0x0000` ## 数据流程 ### 1. 数据采集流程 ``` ADC采样 → 校正算法 → 获取GPS数据 → 打包数据 → 发送/存储 ``` ### 2. 详细流程说明 1. **ADC数据采集**: - 通过外部中断触发,4KHz采样率 - 三路LTC2508 ADC同时采样 2. **数据校正**: - 应用校正算法处理原始ADC数据 - 得到校正后的X、Y、Z轴数据 3. **GPS数据获取**: - 调用[`GPS_GetData()`](User/gps_driver.h:89)获取当前GPS数据 - 检查GPS数据有效性 4. **数据打包**: - 调用[`PackCorrectedDataWithGPS()`](User/data_packet.h:46)打包数据 - 自动计算CRC16校验和 5. **数据输出**: - **串口输出**: 通过USART1(RS485)发送数据包 - **SD卡存储**: 将数据包写入SD卡文件 ## 使用示例 ### 数据包解析示例(接收端) ```c // 接收数据包 CorrectedDataPacketWithGPS_t rx_packet; // 验证数据包 if (ValidateCorrectedPacketWithGPS(&rx_packet)) { // 数据包有效 // 解析ADC数据 float x = rx_packet.corrected_x; float y = rx_packet.corrected_y; float z = rx_packet.corrected_z; // 解析GPS数据 if (rx_packet.gps_valid) { // GPS数据有效 printf("GPS Time: %02d:%02d:%02d UTC\n", rx_packet.gps_hour, rx_packet.gps_minute, rx_packet.gps_second); printf("Position: %.6f°, %.6f°\n", rx_packet.gps_latitude, rx_packet.gps_longitude); printf("Altitude: %.1f m\n", rx_packet.gps_altitude); printf("Satellites: %d\n", rx_packet.gps_satellites); } else { printf("GPS data not available\n"); } } ``` ### Python解析示例 ```python import struct def parse_gps_packet(data): """解析带GPS信息的数据包""" # 数据包格式: I I f f f B B B B f f f B 3s H H # I=uint32, f=float, B=uint8, H=uint16, 3s=3字节 format_str = '