#include "interface_config.h" #include #include // 定时器结构体 Timer data_processing_timer; Timer iim6234_timer; Timer rm3100_timer; Timer rs232_output_timer; StrInfNavigationOutput nav_data = {0}; // 初始化为全0 UnInfProtocolFrame yis321_data = {0}; GGA_Data gga_data1 = {0}; VTG_Data vtg_data1 = {0}; THS_Data ths_data1 = {0}; // 定义按钮结构体 uint8_t remote_tcp_ip[4] = {192,168,10,7}; /* 将度分格式转换为十进制度数 */ double nmea_to_decimal(double dm, char direction) { double degrees = (int)(dm / 100); double minutes = dm - degrees * 100; double decimal = degrees + minutes / 60.0; return (direction == 'S' || direction == 'W') ? -decimal : decimal; } // 解析GNGGA函数 uint8_t parse_GGA(const char* data, GGA_Data* gga) { char buffer[256]; strncpy(buffer, data, sizeof(buffer)); char* token = strtok(buffer, ","); int field_index = 0; while (token != NULL) { switch (field_index) { case 1: gga->utc_time = atof(token); break; case 2: gga->latitude = atof(token); break; case 3: gga->lat_dir = token[0]; break; case 4: gga->longitude = atof(token); break; case 5: gga->lon_dir = token[0]; break; case 6: gga->fix_quality = atoi(token); break; case 7: gga->satellites = atoi(token); break; case 8: gga->hdop = atof(token); break; case 9: gga->altitude = atof(token); break; } token = strtok(NULL, ","); field_index++; } // 度分转十进制(在解析完成后统一处理) if (field_index > 5) { // 确保已解析到经度字段 gga->latitude = nmea_to_decimal(gga->latitude, gga->lat_dir); gga->longitude = nmea_to_decimal(gga->longitude, gga->lon_dir); } return 0; } // 解析GNVTG语句 uint8_t parse_VTG(const char* data, VTG_Data* vtg) { char buffer[256]; strncpy(buffer, data, sizeof(buffer)); buffer[sizeof(buffer)-1] = '\0'; // 确保字符串终止 char* token = strtok(buffer, ","); int field_index = 0; while (token != NULL) { switch (field_index) { case 1: vtg->course_true = atof(token); break; // 真北航向 case 3: vtg->course_magnetic = atof(token); break; // 磁北航向 case 5: vtg->speed_knots = atof(token); break; // 速度(节) case 7: vtg->speed_kmh = atof(token); break; // 速度(km/h) case 9: vtg->mode = token[0]; break; // 模式指示 } token = strtok(NULL, ","); field_index++; } return 0; } // 解析GNTHS语句 uint8_t parse_THS(const char* data, THS_Data* ths) { char buffer[128]; strncpy(buffer, data, sizeof(buffer)); buffer[sizeof(buffer)-1] = '\0'; char* token = strtok(buffer, ","); int field_index = 0; while (token != NULL) { switch (field_index) { case 1: // 航向字段(示例值:341.3344) ths->heading = atof(token); break; case 2: // 模式字段(示例值:A) ths->mode = token[0]; break; // 其他字段(校验和等)根据需求扩展 } token = strtok(NULL, ","); field_index++; } return 0; } void nmeaProcess(void *signal_id) { (void)signal_id; // 标记变量为已使用,避免编译器警告 // printf("AccX:%f,AccY:%f,AccZ:%f,",Acc[0],Acc[1],Acc[2]); // printf("GyroX:%f,GyroY:%f,GyroZ:%f\r\n",Gyro[0],Gyro[1],Gyro[2]);//使用串口打印加速度,角速度数据 // if (!nmea_validate_checksum(&nema_output1.buffer[nema_output1.active_buf^1][0])) //校验代码 // { // printf("NMEA CRC Failed"); // return; // } // 判断后3个字符是否为"GGA"/"VTG"/"THS" if(strncmp(&nema_output1.buffer[3], "GGA", 3) == 0) { nema_output1.frame_ready = 1; } else if(strncmp(&nema_output1.buffer[3], "VTG", 3) == 0) { nema_output1.frame_ready = 2; } else if(strncmp(&nema_output1.buffer[3], "THS", 3) == 0) { nema_output1.frame_ready = 3; } else { // 非目标协议则重置 nema_output1.frame_ready = 0; } // 修改后的switch语句 switch(nema_output1.frame_ready) { case NMEA_TYPE_GGA: if (0 == parse_GGA(&nema_output1.buffer[0], &gga_data1)) { navigation_output1.bit_data.lon = (int32_t) (gga_data1.longitude * 10000000); //20250426度分转换为度10进制 navigation_output1.bit_data.lat = (int32_t) (gga_data1.latitude * 10000000); navigation_output1.bit_data.high = (int32_t)(gga_data1.altitude * 1000);//扩大1000 navigation_output1.bit_data.rtk_state = gga_data1.fix_quality;// // printf("[GGA] Time:%.2f Lat:%.5f%c Lon:%.5f%c rtk_state:%d\n", // gga_data1.utc_time, gga_data1.latitude, gga_data1.lat_dir, // gga_data1.longitude, gga_data1.lon_dir,gga_data1.fix_quality); } else { printf("gga parsing failed" ); } break; case NMEA_TYPE_VTG: if (0 == parse_VTG(&nema_output1.buffer[0], &vtg_data1)) { navigation_output1.bit_data.gps_speed = (int16_t)(vtg_data1.speed_kmh*1000/3600*100);//转换为m/s 扩大100倍 // printf("[VTG] Course:%.1f° Speed:%.1fkm/h\n", // vtg_data1.course_true, vtg_data1.speed_kmh); } else { printf("vtg parsing failed" ); } break; case NMEA_TYPE_THS: if (0 == parse_THS(&nema_output1.buffer[0], &ths_data1)) { navigation_output1.bit_data.dual_antenna_heading = (int16_t)(ths_data1.heading*100);// 扩大100倍 // printf("[THS] Heading:%.1f° Mode:%c\n", // ths_data1.heading, ths_data1.mode); } else { printf("ths parsing failed" ); } break; default: // 处理未知类型 // printf("Unknown NMEA frame type\n"); break; } } unsigned short NumCheak(unsigned char *data,unsigned char len)//和校验计算 { unsigned short NUM=0; unsigned char i; for(i = 0;i < len ; i++) { NUM += data[i]; } return NUM; } uint16_t yis321Cheak(unsigned char *data,unsigned char len)//和校验计算 { uint8_t CK1 = 0; uint8_t CK2 = 0; uint16_t num; for(uint8_t i=0; i