Browse Source

Add positioning database

zack 1 year ago
parent
commit
266d21f937
15 changed files with 391 additions and 4583 deletions
  1. 3 2
      Core/Inc/ConfigMacros.h
  2. 5 5
      Core/Inc/database.h
  3. 1 0
      Core/Inc/ml307a.h
  4. 1 1
      Core/Inc/tt808.h
  5. 174 21
      Core/Src/database.c
  6. 27 25
      Core/Src/freertos.c
  7. 14 4
      Core/Src/interface.c
  8. 11 7
      Core/Src/key.c
  9. 2 1
      Core/Src/main.c
  10. 0 1
      Core/Src/mba32a.c
  11. 8 7
      Core/Src/ml307a.c
  12. 139 144
      Core/Src/tt808.c
  13. 5 15
      MDK-ARM/dtu.uvoptx
  14. 0 4350
      Output/dtu.hex
  15. 1 0
      keilkill.bat

+ 3 - 2
Core/Inc/ConfigMacros.h

@@ -173,7 +173,8 @@ typedef enum {
 	Timeout = 5,
 	Working =6,
 	FinshOK =7,
-	Fail4G =8
+	Fail4G =8,
+	Nosignal =9
 } TipsFlag;
 
 struct keys
@@ -254,7 +255,7 @@ typedef struct {
 	uint16_t OperationType[1];		//操作类型
 	uint16_t OperationResults[1];	//操作结果
 	uint16_t perators[2];		//操作人
-	uint16_t ElectricityLevel;	//电量
+	uint16_t ElectricityLevel[1];	//电量
 	
 } Database;
 

+ 5 - 5
Core/Inc/database.h

@@ -8,11 +8,11 @@
 
 
 void Database_init(uint16_t pushSize1, uint16_t pullSize1 ,uint16_t pushSize2, uint16_t pullSize2);
-void Database_Push(uint16_t pushArr[], uint16_t len);
-void Database_Pull(uint16_t pullArr[], uint16_t len);
-
-
-
+void Database_Push_Loc(uint16_t pushArr[], uint16_t len);
+void Database_Pull_Loc(uint16_t pullArr[], uint16_t len);
+extern bool repeatFlag;
+void testLoc(void);
+void testEve(void);
 
 
 

+ 1 - 0
Core/Inc/ml307a.h

@@ -21,5 +21,6 @@ extern char day_str[3];
 extern char hour_str[3]; 
 extern char minute_str[3];
 extern char second_str[3];
+extern bool signal;
 #endif /*__ML307A_H*/
 

+ 1 - 1
Core/Inc/tt808.h

@@ -13,7 +13,7 @@ void tt808FsFunc(uint8_t xxt[], uint8_t xxtlength, uint16_t XXID);
 void MIPURCHandle(void);
 void ReMIPURC(void);
 void time_bj(void);
-
+void ReU4Proces(void);
 
 
 

+ 174 - 21
Core/Src/database.c

@@ -7,9 +7,12 @@ void Database_Push(uint16_t pushArr[], uint16_t len);
 void Database_Pull(uint16_t pullArr[], uint16_t len);
 void Database_Delete(void);
 void DataHandle(void);
-
+void RecordScale(void);//记录刻度
+void RecordScale_Eve(void);
 uint16_t PDA_pushArr[1024];
 uint16_t PT_pullArr[1024];
+extern TipsFlag tipsflag;	
+extern Menu_table menu;	
 
 // LocDbHeadStart	((uint32_t)0x8060000)  //位置信息头部
 // LocDbBodyStart	((uint32_t)0x8060800)  //位置信息身体
@@ -28,8 +31,8 @@ void Database_init(uint16_t pushSize1, uint16_t pullSize1 ,uint16_t pushSize2, u
 	if(db.LOC_InitInfo[0]==0xffff && db.LOC_InitInfo[2]==0xffff)//未进行写入
 	{
 		//*LOC_InitInfo 0:pushIndex 1:pullIndex 2:pushSize 3:pullSize
-		db.LOC_InitInfo[0] = (uint16_t)0;
-		db.LOC_InitInfo[1] = (uint16_t)0;
+		db.LOC_InitInfo[0] = (uint16_t)0;//初始化入库指针
+		db.LOC_InitInfo[1] = (uint16_t)0;//初始化出库指针
 		db.LOC_InitInfo[2] = (uint16_t)pushSize1;
 		db.LOC_InitInfo[3] = (uint16_t)pullSize1;
 		Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,4);//4*2B
@@ -67,55 +70,205 @@ void Database_init(uint16_t pushSize1, uint16_t pullSize1 ,uint16_t pushSize2, u
   uint16_t pullArr[7]={0};
  */
 HAL_StatusTypeDef PushSta;
-void Database_Push(uint16_t pushArr[], uint16_t len)
+uint16_t temp_jc[7];//检测相同缓存
+uint16_t temp_jc_Eve[7];//检测相同缓存
+uint32_t newPushIndex_Loc=0;
+uint32_t newPullIndex_Loc=0;
+bool Overwrite_pushindex =false;
+bool Overwrite_pushindex_Eve =false;
+bool repeatFlag = false;
+bool repeatFlag_Eve = false;
+
+//***************定位信息入库
+void Database_Push_Loc(uint16_t pushArr[], uint16_t len)
 {
-	if(db.LOC_InitInfo[0] == 0)	//Loc PushIndex
+	if(db.LOC_InitInfo[0] == 0)	//Loc PushIndex Init
 	{
 		PushSta = Flash_WriteBytes(pushArr,LocDbBodyStart,len);//len*2B
 		if(PushSta == HAL_OK)
 		{
-			db.LOC_InitInfo[0]+=1;
+			db.LOC_InitInfo[0] += 1;
 			Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,1);//1*2B
 		}
 	}
-	else
+	//*读取缓存检测
+	Flash_ReadBytes(temp_jc,LocDbBodyStart+((db.LOC_InitInfo[0]-1)*14),7);//len*2B
+
+	
+	//*uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], db.speed[0]};//4B世纪秒+8B经纬度+2B速度
+	if(db.LOC_InitInfo[0] > 0 && temp_jc[2]== db.WD_u16[0] && temp_jc[3]== db.WD_u16[1] && temp_jc[4]== db.JD_u16[0] && temp_jc[5]== db.JD_u16[1])//做相同检测
 	{
-		PushSta = Flash_WriteBytes(pushArr,LocDbBodyStart+(db.LOC_InitInfo[0]*14),len);//len*2B
-		if(PushSta == HAL_OK)
+		//*数据一样无需写入操作
+	}
+	else 
+	{
+		if(Overwrite_pushindex)//重头,避免多次写入
 		{
-			Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,1);//1*2B
-			db.LOC_InitInfo[0]+=1;
+			Overwrite_pushindex = false;
+		}
+		else
+		{
+			PushSta = Flash_WriteBytes(pushArr,(LocDbBodyStart+(db.LOC_InitInfo[0]*14)),len);//len*2B
+			if(PushSta == HAL_OK)
+			{
+				db.LOC_InitInfo[0] = db.LOC_InitInfo[0]+1;//写入较记录少1,在头开始写入
+				Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,1);//1*2B
+			}
 		}
 	}
-	
+	RecordScale();
 }
 
-
-void Database_Pull(uint16_t pullArr[], uint16_t len)
+void Database_Pull_Loc(uint16_t pullArr[], uint16_t len)//14B
 {
-	if(db.LOC_InitInfo[1] == 0)	//Loc PushIndex
+	if(db.LOC_InitInfo[1] == 0)	//Loc PullIndex Init
 	{
 		Flash_ReadBytes(pullArr,LocDbBodyStart,len);//len*2B
-		db.LOC_InitInfo[1]+=1;
-		
-		Flash_WriteBytes(&db.LOC_InitInfo[1],LocDbHeadStart+2,1);//1*2B 更新刻度
-		
+		db.LOC_InitInfo[1] += 1;
+		Flash_WriteBytes(&db.LOC_InitInfo[1],LocDbHeadStart+2,1);//1*2B//更新出库指针
 	}
+
 	else
 	{
-		Flash_ReadBytes(pullArr,LocDbBodyStart+(db.LOC_InitInfo[1]*14),len);//len*2B
-		Flash_WriteBytes(&db.LOC_InitInfo[1],LocDbHeadStart+2,1);//1*2B 更新刻度
+		if(db.LOC_InitInfo[1] == db.LOC_InitInfo[0])//*判出库刻度是否等于写入刻度
+		{
+			Flash_ReadBytes(pullArr,(LocDbBodyStart+(db.LOC_InitInfo[1]*14)),len);//len*2B
+			repeatFlag = true;
+		}
+		else
+		{
+			repeatFlag = false;
+			Flash_ReadBytes(pullArr,(LocDbBodyStart+(db.LOC_InitInfo[1]*14)),len);//len*2B
+			db.LOC_InitInfo[1]+=1;
+			Flash_WriteBytes(&db.LOC_InitInfo[1],LocDbHeadStart+2,1);//1*2B//更新出库指针
+		}
+
 	}
+	RecordScale();
 }
 
 
 
+
+//***************状态信息入库
+void Database_Push_Eve(uint16_t pushArr[], uint16_t len)
+{
+	if(db.EVE_InitInfo[0] == 0)	//Loc PushIndex Init
+	{
+		PushSta = Flash_WriteBytes(pushArr,EveDbBodyStart,len);//len*2B
+		if(PushSta == HAL_OK)
+		{
+			db.EVE_InitInfo[0] += 1;
+			Flash_WriteBytes(db.EVE_InitInfo,EveDbHeadStart,1);//1*2B
+		}
+	}
+	//*读取缓存检测
+	Flash_ReadBytes(temp_jc_Eve,EveDbBodyStart+((db.EVE_InitInfo[0]-1)*14),14);//len*2B
+
+	
+	//*uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], db.speed[0]};//4B世纪秒+8B经纬度+2B速度
+	if(db.EVE_InitInfo[0] > 0 && temp_jc_Eve[2]== db.WD_u16[0] && temp_jc_Eve[3]== db.WD_u16[1] && temp_jc_Eve[4]== db.JD_u16[0] && temp_jc_Eve[5]== db.JD_u16[1])//做相同检测
+	{
+		//*数据一样无需写入操作
+	}
+	else 
+	{
+		if(Overwrite_pushindex_Eve)//重头,避免多次写入
+		{
+			Overwrite_pushindex_Eve = false;
+		}
+		else
+		{
+			PushSta = Flash_WriteBytes(pushArr,(EveDbBodyStart+(db.EVE_InitInfo[0]*28)),len);//len*2B
+			if(PushSta == HAL_OK)
+			{
+				db.EVE_InitInfo[0] = db.EVE_InitInfo[0]+1;//写入较记录少1,在头开始写入
+				Flash_WriteBytes(db.EVE_InitInfo,EveDbHeadStart,1);//1*2B
+			}
+		}
+	}
+	RecordScale_Eve();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 void DataHandle(void)//接收与发送数据处理
 {
 	
 }
 
+void RecordScale(void)//记录刻度
+{
+	Flash_ReadBytes(db.LOC_InitInfo, LocDbHeadStart, 4);	//读取入库刻度
+
+	if(db.LOC_InitInfo[0] == db.LOC_InitInfo[2])//入库结束(返回
+	{
+		db.LOC_InitInfo[0]=0;
+		Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,1);//1*2B 更新最新刻度
+		Overwrite_pushindex=true;
+	}
+	else if(db.LOC_InitInfo[1] == db.LOC_InitInfo[3])//出库结束(返回
+	{
+		db.LOC_InitInfo[1]=0;
+		Flash_WriteBytes(&db.LOC_InitInfo[1],LocDbHeadStart+2,1);//1*2B 更新最新刻度
+	}
+}
+
+void RecordScale_Eve(void)//记录刻度
+{
+
+	Flash_ReadBytes(db.EVE_InitInfo, EveDbHeadStart, 4);	//读取入库刻度
+	if(db.EVE_InitInfo[0] == db.EVE_InitInfo[2])//入库结束(返回
+	{
+		db.EVE_InitInfo[0]=0;
+		Flash_WriteBytes(db.EVE_InitInfo,EveDbHeadStart,1);//1*2B 更新最新刻度
+		Overwrite_pushindex_Eve=true;
+	}
+	
+}
+
 
+void testLoc(void)
+{
+	uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], db.speed[0]};//4B世纪秒+8B经纬度+2B速度
+	Database_Push_Loc(TESTDATA, 7);//14B 写入操作
+		
+	uint16_t TESTDATApull[7]; 
+	Database_Pull_Loc(TESTDATApull, 7);
+	if(!repeatFlag)
+	{
+		printf("出库:%04X%04X%04X%04X%04X%04X%04X\n",TESTDATApull[0],TESTDATApull[1],TESTDATApull[2],TESTDATApull[3],TESTDATApull[4],TESTDATApull[5],TESTDATApull[6]);	
+	}
+	else
+	{
+		printf("与上次相同\r\n");
+	}	
+}
 
 
+void testEve(void)
+{
+	uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], \
+						   db.LockSn[0],db.LockSn[1],db.LockSn[2], db.OperationType[0],db.OperationResults[0], db.perators[0], db.perators[1], db.ElectricityLevel[0]};//4B世纪秒+8B经纬度+2B速度
+	//Database_Push_Eve(TESTDATA, 14);//28B 写入操作
+		
+
+}
+
 

+ 27 - 25
Core/Src/freertos.c

@@ -29,6 +29,7 @@
 #include "tt808.h"
 #include "usart.h"
 #include "interface.h"
+#include "database.h"
 
 /* USER CODE END Includes */
 
@@ -40,6 +41,7 @@ extern LockInfo lockinfo;
 extern Menu_table menu;	
 extern bool refresh;
 extern Database db;
+extern TipsFlag tipsflag;	
 /* USER CODE END PTD */
 
 /* Private define ------------------------------------------------------------*/
@@ -55,6 +57,7 @@ extern Database db;
 
 /* Private variables ---------------------------------------------------------*/
 /* USER CODE BEGIN Variables */
+
 /* USER CODE END Variables */
 osThreadId ScanKeyTaskHandle;
 osThreadId BT4GTaskHandle;
@@ -161,7 +164,14 @@ void StartScanKeyTask(void const * argument)
 	Pre_processing_4G();			//4G传递准备   标志位->module4G_F
 	MIPURCHandle();					//平台接收处理
 	Lock_OandC();					//施解封
-
+	//*开发者
+	if(Developer_PortalA==1 && Developer_PortalD==4)
+	{
+		SET_MENU_STATUS(0xFF,1,0,0);
+		OLED_Refresh();
+		Developer_PortalA=0;
+		Developer_PortalD=0;
+	}
   }
   /* USER CODE END StartScanKeyTask */
 }
@@ -180,19 +190,10 @@ void StarBT4GTask(void const * argument)
   /* Infinite loop */
   for(;;)
   {
-    osDelay(1);
+    osDelay(300000);
 	  
-	Printf_u4u5logbyU1();//打印log
-	ReMIPURC();
-	ReU5Proces();
-	//*开发者
-	if(Developer_PortalA==1 && Developer_PortalD==4)
-	{
-		SET_MENU_STATUS(0xFF,1,0,0);
-		OLED_Refresh();
-		Developer_PortalA=0;
-		Developer_PortalD=0;
-	}
+
+
 
   }
   /* USER CODE END StarBT4GTask */
@@ -212,10 +213,13 @@ void StartTestTask(void const * argument)
   /* Infinite loop */
   for(;;)
   {
-    osDelay(1);    
-
-	  
-		  
+    osDelay(10000);    
+	if(MgnssFlag)
+	{
+		USART_SendString(&huart4, "AT+MGNSSLOC\r\n");
+	}
+	//testLoc();
+	testEve();
 
   }
   /* USER CODE END StartTestTask */
@@ -234,14 +238,12 @@ void StartloginfoTaskTask(void const * argument)
   /* Infinite loop */
   for(;;)
   {
-    osDelay(30000);
-	if(MgnssFlag)
-	{
-		USART_SendString(&huart4, "AT+MGNSSLOC\r\n");
-	    uint16_t TESTDATA[] = {db.timeStamp[0], db.timeStamp[1], db.WD_u16[0], db.WD_u16[1], db.JD_u16[0], db.JD_u16[1], };
-	}
-	  
-	//event_lock();
+    osDelay(1);
+
+	Printf_u4u5logbyU1();//打印log
+	ReMIPURC();
+	ReU4Proces();
+	ReU5Proces();
 
   }
   /* USER CODE END StartloginfoTaskTask */

+ 14 - 4
Core/Src/interface.c

@@ -82,7 +82,7 @@ void Jump_interface(void)
 		refresh=false;
 	}
 
-	if(sys_mode[0] == PDA_MODE)//PDA Mode
+	if(sys_mode[1] == PDA_MODE)//PDA Mode
 	{	
 		switch(menu.current)
 		{
@@ -186,7 +186,7 @@ void Jump_interface(void)
 			}
 		}
 	}
-	else if(sys_mode[0] == DTU_MODE)//DTU Mode
+	else if(sys_mode[1] == DTU_MODE)//DTU Mode
 	{	
 		switch(menu.current)
 		{
@@ -212,7 +212,11 @@ void Jump_interface(void)
 			}
 		}
 	}
-	
+	else if(sys_mode[1] == 0)
+	{
+		Developer_Options();
+	}
+
 	
 }
 
@@ -573,11 +577,17 @@ void WarningTip(void)
 		}
 		case Fail4G:
 		{
-			OLED_ShowString(35,32,(unsigned char*)" 4G Fail!",16,0);
+			OLED_ShowString(35,32,(unsigned char*)"4G Fail!",16,1);
+            break;
+		}
+		case Nosignal:
+		{
+			OLED_ShowString(35,32,(unsigned char*)"NoSignal",16,1);
             break;
 		}
         default:
             // ´¦ÀíÆäËûÇé¿ö
+			//menu.current=0;
             break;
     }
 }

+ 11 - 7
Core/Src/key.c

@@ -473,13 +473,15 @@ uint8_t KEY_3_Scan_PDA(void)
 						{
 							if(menu.up==1)//PDA 0x0000
 							{
-								sys_mode[0]=PDA_MODE;
+								signal = true;
+								sys_mode[1]=PDA_MODE;
 							}
 							else if(menu.up==0)//DTU 0x0001
 							{
-								sys_mode[0]=DTU_MODE;
+								signal = true;
+								sys_mode[1]=DTU_MODE;
 							}
-							Flash_WriteBytes(sys_mode,SysModeAddr,1);
+							Flash_WriteBytes(&sys_mode[1],SysModeAddr,1);
 							menu.current=0;//回到初始
 							refresh=true;
 							break;
@@ -744,17 +746,19 @@ uint8_t KEY_3_Scan_DTU(void)
 						{
 							if(menu.up==1)//PDA 0x0000
 							{
-								sys_mode[0]=PDA_MODE;
+								sys_mode[1]=PDA_MODE;
 								if(sendCmd_BT("AT+ADV=0\r\n","OK",1,1))//开启广播
 								{
+									signal = true;
 									printf("关闭广播\r\n");
 								}
 							}
 							else if(menu.up==0)//DTU 0x0001
 							{
-								sys_mode[0]=DTU_MODE;
+								sys_mode[1]=DTU_MODE;
 								if(sendCmd_BT("AT+ADV=1\r\n","OK",1,1))//开启广播
 								{
+									signal = true;
 									printf("开启广播\r\n");
 								}
 							}
@@ -837,14 +841,14 @@ uint8_t KEY_4_Scan_DTU(void)
 
 void updatekeystate(void)
 {
-	if(sys_mode[0] == PDA_MODE)//PDAmode 需DTU开锁
+	if(sys_mode[1] == PDA_MODE)//PDAmode 需DTU开锁
 	{
 		KEY_1_Scan_PDA();
 		KEY_2_Scan_PDA();
 		KEY_3_Scan_PDA();
 		KEY_4_Scan_PDA();
 	}
-	else if(sys_mode[0] == DTU_MODE)
+	else if(sys_mode[1] == DTU_MODE)
 	{
 		KEY_1_Scan_DTU();
 		KEY_2_Scan_DTU();

+ 2 - 1
Core/Src/main.c

@@ -124,7 +124,8 @@ int main(void)
   __HAL_UART_ENABLE_IT(&huart5, UART_IT_RXNE);//¿ªÆôBT½ÓÊÕÖжÏ
 
   START_PROCESS();
-  Database_init(0xFA0,0xFA0,0x7D0,0x7D0);
+  //Database_init(0xFA0,0xFA0,0x7D0,0x7D0);
+  Database_init(0x5,0x5,0x5,0x5);
   
 
   

+ 0 - 1
Core/Src/mba32a.c

@@ -197,7 +197,6 @@ void MBA32A_Init(void)
 	//关闭4G后需要取消注释
 //	menu.current=0;//回到初始
 //	refresh=true;
-	sendCmd_4G("AT+MGNSS=0\r\n", "OK", 1, 1);//关闭MGNSS
 
 }
 /**

+ 8 - 7
Core/Src/ml307a.c

@@ -19,6 +19,7 @@ bool reset4Gmodule = false;
 bool MgnssFlag = false;
 extern bool refresh;
 extern TipsFlag tipsflag;	
+bool signal = false;
 
 //*字符
 char year_str[3];
@@ -124,10 +125,7 @@ void ML307A_Init(void)
 							MgnssFlag = true;
 						}
 					}
-					
 				}
-				
-				
 				printf("#TCP设置完成\r\n");
 				Time_inquiry(0);
 				module4G_F=true;
@@ -138,13 +136,12 @@ void ML307A_Init(void)
 			break;
 		}
 		
-		
 	}
 	
 	Flash_ReadBytes(sys_mode, SysModeAddr, 1);//读取一个2B的,系统模式
 	if(sys_mode[0]==0xFFFF)
 	{
-		sys_mode[0]=DTU_MODE;
+		sys_mode[1]=DTU_MODE;//默认进入
 		menu.current=0xFF;
 		if(!module4G_F)
 		{
@@ -154,9 +151,11 @@ void ML307A_Init(void)
 	}
 	else if(sys_mode[0]==DTU_MODE)
 	{
+		sys_mode[1]=DTU_MODE;
 		if(sendCmd_BT("AT+ADV=1\r\n","OK",1,1))//开启广播
 		{
 			printf("开启广播\r\n");
+			menu.current=0;
 		}
 		else if(!module4G_F)
 		{
@@ -165,15 +164,17 @@ void ML307A_Init(void)
 		}
 		else
 		{
-			menu.current=0;
+			//Todo
 		}
 		
 	}
 	else if(sys_mode[0]==PDA_MODE)
 	{
+		sys_mode[1]=PDA_MODE;
 		if(sendCmd_BT("AT+ADV=0\r\n","OK",1,1))//关闭广播
 		{
 			printf("关闭广播\r\n");
+			menu.current=0;
 		}
 		else if(!module4G_F)
 		{
@@ -182,7 +183,7 @@ void ML307A_Init(void)
 		}
 		else
 		{
-			menu.current=0;
+			//Todo
 		}
 	}
 	refresh=true;	

+ 139 - 144
Core/Src/tt808.c

@@ -20,7 +20,12 @@ uint8_t MIPurcXXTCSJ[100];//平台
 uint8_t speedBegin=0;
 uint8_t speedEnd=0;
 uint8_t speed[10];		//处理头部
-
+double dSpeed=0;
+double dWd=0;
+double dJd=0;
+char cSpeed[10];
+char wd[15];
+char jd[15];
 char MGNSSLOC[100];	//接收定位数据
 
 char MGNSSLOC_time[6];	//接收定位数据
@@ -34,7 +39,7 @@ extern bool refresh;
 extern Database db;
 //*布尔
 bool ZDJQflag = false;
-
+bool GnssFlag = false;
 
 void chuli(uint16_t XXID)
 {
@@ -176,6 +181,58 @@ void tt808FsFunc(uint8_t xxt[], uint8_t xxtlength, uint16_t XXID)
 
 
 
+
+// 函数用于提取第7到第8个逗号之间的字符串
+void extractString(char* receiveStr, char* result, uint8_t start, uint16_t end)
+{
+  int comma_count = 0;
+  int start_index = -1;
+  int end_index = -1;
+  int length = strlen(receiveStr);
+  // 遍历字符串,统计逗号数量和记录起始和结束索引
+  for (int i = 0; i < length; i++)
+  {
+    if (receiveStr[i] == ',')
+    {
+      comma_count++;
+      if (comma_count == start)
+      {
+        start_index = i + 1; // 第start个逗号之后的字符
+      }
+      else if (comma_count == end)
+      {
+		if(start==1 && end==2)//*纬度去尾符号 
+		{
+			end_index = i-1; // 第end个逗号之前的字符
+		}
+		else if(start==2 && end==3)//*经度去尾符号 
+		{
+			end_index = i-1; // 第end个逗号之前的字符
+		}
+		else
+		{
+			end_index = i; // 第end个逗号之前的字符
+		}
+        
+        break;
+      }
+    }
+  }
+  
+  // 提取字符串并存储在result数组中
+  if (start_index != -1 && end_index != -1 && start_index < end_index)
+  {
+    strncpy(result, receiveStr + start_index, end_index - start_index);
+    result[end_index - start_index] = '\0'; // 添加字符串结束符
+  }
+}
+
+double convertToDouble(char* str) {
+  double result;
+  sscanf(str, "%lf", &result);
+  return result;
+}
+
 char hex2asc(const char *hex)
 {
 	char asc = 0;
@@ -235,69 +292,13 @@ void ReMIPURC(void)
 	 
 				//时间     纬度(北纬)   经度(东经)  水平精度因子  海拔高度    定位类型(1无,2 2d,3 3d) 运动角度    水平运动速度(KM/h)    水平运动速度(Knots)	日月年	卫星数量	差分定位标识(1单点,2差分)
 //eg.+MGNSSLOC: 015032.301,3014.8605N,12001.9250E,1.8,			17.6,		3,                      0.00,		3.6,			      1.9,					080424,	12,			1	 
-	 else if(U4_4GrecvBuff[1]==0x4D && U4_4GrecvBuff[2]==0x47 && U4_4GrecvBuff[3]==0x4e \
-		  && U4_4GrecvBuff[4]==0x53 && U4_4GrecvBuff[5]==0x53 && U4_4GrecvBuff[6]==0x4C \
-		&&  U4_4GrecvBuff[7]==0x4f && U4_4GrecvBuff[8]==0x43)	//监测平台回复+MGNSSLOC
+	 else if((U4_4GrecvBuff[2]==0x47 || (U4_4GrecvBuff[0]==0x4F && U4_4GrecvBuff[1]==0x4B)) && MgnssFlag)	//监测平台回复+MGNSSLOC OK4f4b
 	 {
 
 		memcpy(MGNSSLOC,&U4_4GrecvBuff[11],75);
-
-		for(int i = 0;i<70;i++)
-		{
-			bool Dh = false;
-			if(MGNSSLOC[i]==0x2C)//逗号
-			{
-				Dh = true;
-				index_2c++;
-			}
-			if(Dh)
-			{
-				Dh = false;
-				RTCtime();//同步时间
-				//printf("%d\r\n",index_2c);
-
-				if(index_2c == 2)//纬度
-				{
-					tt808.WD_u32 = (MGNSSLOC[11]&0xf)*10000000 + (MGNSSLOC[12]&0xf)*1000000 + (MGNSSLOC[13]&0xf)*100000 + (MGNSSLOC[14]&0xf)*10000 \
-								  +(MGNSSLOC[16]&0xf)*1000 + (MGNSSLOC[17]&0xf)*100 + (MGNSSLOC[18]&0xf)*10 + (MGNSSLOC[19]&0xf);
-					db.WD_u16[0] = (tt808.WD_u32 >> 16) & 0xFFFF;
-					db.WD_u16[1] = (tt808.WD_u32) & 0xFFFF;
-					//printf("%08X\r\n",tt808.WD_u32);
-				}
-				else if(index_2c == 3)//经度
-				{
-					tt808.JD_u32 = (MGNSSLOC[22]&0xf)*100000000 + (MGNSSLOC[23]&0xf)*10000000 + (MGNSSLOC[24]&0xf)*1000000 + (MGNSSLOC[25]&0xf)*100000 \
-								  +(MGNSSLOC[26]&0xf)*10000 + (MGNSSLOC[28]&0xf)*1000 + (MGNSSLOC[29]&0xf)*100 + (MGNSSLOC[30]&0xf)*10 + (MGNSSLOC[31]&0xf);
-					db.JD_u16[0] = (tt808.JD_u32 >> 16) & 0xFFFF;
-					db.JD_u16[1] = (tt808.JD_u32) & 0xFFFF;
-					//printf("%08X\r\n",tt808.JD_u32);
-				}
-				else if(index_2c == 7)//速度
-				{
-					speedBegin = i+1;
-				}
-				else if(index_2c == 8)//速度
-				{
-					speedEnd = i;
-				}
-				else if(index_2c==11)
-				{
-					index_2c=0;
-				}
-
-				
-				for(int j = speedBegin;j<speedEnd;j++)
-				{
-					for(int z =0;z<(speedEnd-speedBegin+1);z++)
-					{
-						speed[z] = MGNSSLOC[j];
-					}
-				}
-			}
-		}
 		
-
-		//memset(MGNSSLOC,0,100);
+		GnssFlag=true;
+	
 		memset(U4_4GrecvBuff,0,BUFFER_SIZE);
 	 }
 	 
@@ -409,10 +410,6 @@ void MIPURCHandle(void)
 				}
 				memset(MIPurc,0,rlt);//rlt下发长度 
 				
-				
-				
-				
-				
 			}
 		 }
 		 
@@ -441,84 +438,10 @@ void MIPURCHandle(void)
 	 
 }
 
-void GNSSprocess(void)
-{
-	Time_inquiry(1);	//问时间
-	
-	time_bj();//时间戳
-	//*报警标志
-	GNSSdata[0] = 0x00;
-	GNSSdata[1] = 0x00;
-	GNSSdata[2] = 0x00;
-	GNSSdata[3] = 0x00;
-	//*状态
-	GNSSdata[4] = 0x00;
-	GNSSdata[5] = 0x00;
-	GNSSdata[6] = 0x00;
-	GNSSdata[7] = 0x00;
-	//*纬度
-	GNSSdata[8] = (tt808.WD_u32>>24)&0xff;
-	GNSSdata[9] = (tt808.WD_u32>>16)&0xff;
-	GNSSdata[10] =(tt808.WD_u32>>8)&0xff;
-	GNSSdata[11] = tt808.WD_u32&0xff;
-	//*经度
-	GNSSdata[12] = (tt808.JD_u32>>24)&0xff;
-	GNSSdata[13] = (tt808.JD_u32>>16)&0xff;
-	GNSSdata[14] = (tt808.JD_u32>>8)&0xff;
-	GNSSdata[15] = tt808.JD_u32&0xff;
-	//*高程
-	GNSSdata[16] = 0x00;
-	GNSSdata[17] = 0x00;
-	//*速度
-	GNSSdata[18] = 0x00;
-	GNSSdata[19] = 0x00;
-	//*方向
-	GNSSdata[20] = 0x00;
-	GNSSdata[21] = 0x00;
-	//*时间
-	GNSSdata[22] = tt808.Rtime[0];
-	GNSSdata[23] = tt808.Rtime[1];
-	GNSSdata[24] = tt808.Rtime[2];
-	GNSSdata[25] = tt808.Rtime[3];//加东八区
-	GNSSdata[26] = tt808.Rtime[4];
-	GNSSdata[27] = tt808.Rtime[5];
-		
-		
-}
 
 time_t timestamp ;
 void time_bj(void) {
-//	char c_time_string[50];
-//    snprintf(c_time_string, sizeof(c_time_string), "%04d-%02d-%02d %02d:%02d:%02d",
-//    tt808.Rtime[0]+2000, tt808.Rtime[1], tt808.Rtime[2], tt808.Rtime[3]-8, tt808.Rtime[4], tt808.Rtime[5]);
-//	
-//    char* token = strtok(c_time_string, "- :"); // 以"-", " ", ":"为分隔符,逐个提取字段
-//    int year, month, day, hour, minute, second;
-//    
-//    if (token != NULL) {
-//        year = atoi(token);
-//        token = strtok(NULL, "- :");
-//    }
-//    if (token != NULL) {
-//        month = atoi(token);
-//        token = strtok(NULL, "- :");
-//    }
-//    if (token != NULL) {
-//        day = atoi(token);
-//        token = strtok(NULL, "- :");
-//    }
-//    if (token != NULL) {
-//        hour = atoi(token);
-//        token = strtok(NULL, "- :");
-//    }
-//    if (token != NULL) {
-//        minute = atoi(token);
-//        token = strtok(NULL, "- :");
-//    }
-//    if (token != NULL) {
-//        second = atoi(token);
-//    }
-
+	
 		struct tm timeinfo;
 		timeinfo.tm_year = tt808.Rtime[0]+2000-1900;
 		timeinfo.tm_mon = tt808.Rtime[1]-1;
@@ -527,12 +450,84 @@ void time_bj(void) {
 		timeinfo.tm_min = tt808.Rtime[4];
 		timeinfo.tm_sec = tt808.Rtime[5];
 		timestamp = mktime(&timeinfo);
+			
+		db.timeStamp[0] = (timestamp >> 16)&0xFFFF;
+		db.timeStamp[1] = (timestamp)&0xFFFF;
+}
+
+
+
+
+
+
+
+void ReU4Proces(void)
+{
+	if(GnssFlag)
+	{
+		GnssFlag=false;
+		RTCtime();//同步时间
+
+		// 调用函数提取字符串
+		extractString(MGNSSLOC, cSpeed,7 ,8);//采集
+		dSpeed = convertToDouble(cSpeed);	//转换浮点数
+		dSpeed*=100;
+
+
+		// 调用函数提取字符串
+		extractString(MGNSSLOC, wd,1 ,2);//采集
+		dWd = convertToDouble(wd);	//转换浮点数
+		dWd*=10000;
+
+		// 调用函数提取字符串
+		extractString(MGNSSLOC, jd,2 ,3);//采集
+		dJd = convertToDouble(jd);	//转换浮点数
+		dJd*=10000;
+		
+		if(dSpeed !=0 && dWd!=0 &&dJd!=0) //有数据进行更新!
+		{
+			db.speed[0] = (uint16_t)dSpeed;
+			db.WD_u16[0] = ((uint32_t)dWd >> 16) &0xffff;
+			db.WD_u16[1] = ((uint32_t)dWd) &0xffff;		// 打印提取到的字符串
+			db.JD_u16[0] = ((uint32_t)dJd >> 16) &0xffff;
+			db.JD_u16[1] = ((uint32_t)dJd) &0xffff;
 		
-		//printf("转换后的时间戳:%08X\n", timestamp);
+//			printf("提取到的字符串为:%s\n", speed);
+//			printf("Converted double: %.f\n", dSpeed);
+//			printf("Converted double: %04X\n", db.speed[0]);
+//			printf("提取到的字符串为:%s\n", wd);
+//			printf("Converted double: %.f\n", dWd);
+//			printf("Converted double: %04X%04X\n", db.WD_u16[0],db.WD_u16[1]);		 
+//			printf("提取到的字符串为:%s\n", jd);
+//			printf("Converted double: %.f\n", dJd);
+//			printf("Converted double: %04X%04X\n", db.JD_u16[0],db.JD_u16[1]);	
+			if(menu.current == 0xBB)
+			{
+				menu.current = 0;
+				refresh=true;
+			}
+		}
+ 		else
+		{
+			if(signal)
+			{ 
+				//signal = false;
+				menu.current = 0xBB;
+				tipsflag = Nosignal;
+				refresh=true;
+			}
 
+		}
 
-	
-		db.timeStamp[0] = (timestamp >> 16)&0xFFFF;
-		db.timeStamp[1] = (timestamp)&0xFFFF;
+		//printf("Time: %04X%04X\n", db.timeStamp[0],db.timeStamp[1]);		
+
+		memset(MGNSSLOC,0,100);
+
+	}
 }
 
+
+
+
+
+

+ 5 - 15
MDK-ARM/dtu.uvoptx

@@ -153,29 +153,19 @@
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>MGNSSLOC</ItemText>
+          <ItemText>db</ItemText>
         </Ww>
         <Ww>
           <count>1</count>
           <WinNumber>1</WinNumber>
-          <ItemText>speed</ItemText>
-        </Ww>
-        <Ww>
-          <count>2</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>speedBegin</ItemText>
-        </Ww>
-        <Ww>
-          <count>3</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>speedEnd</ItemText>
+          <ItemText>temp_jc</ItemText>
         </Ww>
       </WatchWindow1>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>
           <SubType>0</SubType>
-          <ItemText>LocDbHeadStart</ItemText>
+          <ItemText>EveDbHeadStart</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>
@@ -183,7 +173,7 @@
         <Mm>
           <WinNumber>2</WinNumber>
           <SubType>0</SubType>
-          <ItemText>SysModeAddr</ItemText>
+          <ItemText>EveDbBodyStart</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow2>
@@ -365,7 +355,7 @@
       <GroupNumber>2</GroupNumber>
       <FileNumber>10</FileNumber>
       <FileType>1</FileType>
-      <tvExp>0</tvExp>
+      <tvExp>1</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>../Core/Src/main.c</PathWithFileName>

File diff suppressed because it is too large
+ 0 - 4350
Output/dtu.hex


+ 1 - 0
keilkill.bat

@@ -24,6 +24,7 @@ del *.iex /s
 del *.htm /s
 del *.sct /s
 del *.map /s
+del *.hex /s
 
 del *.dbgconf /s
 del *.LINGZHUNING /s