zack 1 рік тому
батько
коміт
54f4de2adb
7 змінених файлів з 304 додано та 187 видалено
  1. 14 0
      Core/Inc/ConfigMacros.h
  2. 116 122
      Core/Src/database.c
  3. 3 3
      Core/Src/freertos.c
  4. 4 1
      Core/Src/main.c
  5. 27 2
      Core/Src/ml307a.c
  6. 130 54
      Core/Src/tt808.c
  7. 10 5
      MDK-ARM/dtu.uvoptx

+ 14 - 0
Core/Inc/ConfigMacros.h

@@ -42,6 +42,7 @@
 #define SysModeAddr					((uint32_t)0x8050900)  
 #define tt808serialNum				((uint32_t)0x8051000)  
 #define phoneNumADDR				((uint32_t)0x8051100)  
+#define ReIPAddr					((uint32_t)0x8051200)  
 
 
 
@@ -302,11 +303,13 @@ typedef struct {
     uint16_t loc_pullIndex;		//出库指针
     uint16_t loc_pushSize;		//入库刻度
     uint16_t loc_pullSize;		//出库刻度
+    uint32_t loc_Conter;	//地址总擦计数
 	
     uint16_t eve_pushIndex;		//入库指针
     uint16_t eve_pullIndex;		//出库指针
     uint16_t eve_pushSize;		//入库刻度
     uint16_t eve_pullSize;		//出库刻度
+    uint32_t eve_Conter;	//地址总擦计数
 	
 	
 	uint16_t alarmFlagH;		//报警标志
@@ -351,5 +354,16 @@ typedef struct {
     TestTemp temppush;
     TestTemp temppull;
 } DatabaseEvent;
+
+
+typedef struct {
+	uint16_t IP0;
+	uint16_t IP1;
+	uint16_t IP2;
+	uint16_t IP3;
+	uint16_t IPp;
+	
+} Ipaddr;
+
 #endif /*__CONFIGMACROS_H*/
 

+ 116 - 122
Core/Src/database.c

@@ -51,8 +51,6 @@ void Database_init(uint16_t pushsize_loc, uint16_t pullsize_loc,uint16_t pushsiz
 	}
 
 	
-	
-	
 //	Flash_ReadBytes((uint16_t*)&(dbeveptr->temppush),EveDbHeadStart,4);//读取loc头部是否发生写入
 //	if(dbeveptr->temppush.eve_pushIndex == 0xFFFF && dbeveptr->temppush.eve_pullIndex ==0xFFFF)//未写入
 //	{
@@ -76,182 +74,174 @@ void Database_init(uint16_t pushsize_loc, uint16_t pullsize_loc,uint16_t pushsiz
 bool Overwrite_loc = false;
 HAL_StatusTypeDef PushSta;
 //***************定位信息入库
-
+bool twowrite = false;
 //*20min最少一条
 //*大于10km每5min一条
 void Database_Push(uint8_t object)
 {
 	if(object==0)//位置信息写入
 	{
+		if(dblocptr->headinfo.loc_pushIndex==0)//判断是否初次写入
+		{	
+			printf("1\r\n");		
+			PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart,17);//34
+			if(PushSta==HAL_OK)
+			{
+				printf("区头开始写入\r\n");
+			}
+			dblocptr->headinfo.loc_pushIndex+=1;	//入库索引
+			dblocptr->headinfo.loc_Conter+=1;		//入库总计数
+			Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//向dblocptr->headinfo写入6*2个字节
+		}
 #if timingPush==1
 		if(dblocptr->temppush.loc_pushIndex!=0 && dblocptr->location.speed>0)//速度大于10km/h入库(100)
 #else
 		if(dblocptr->temppush.loc_pushIndex!=0 && dblocptr->location.speed>10)//速度大于10km/h入库
 #endif
 		{
-			Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pushIndex-1)*34),17);//读取body信息
-			if(dblocptr->temppush.alarmFlagH==0xFFFF)
-			{
-				dblocptr->temppush.alarmFlagH=0;
-				dblocptr->temppush.alarmFlagL=0;
-				dblocptr->temppush.statusFlagH=0;		//状态标志
-				dblocptr->temppush.statusFlagL=0;		//状态标志
-				dblocptr->temppush.latitudeH=0;		//纬度
-				dblocptr->temppush.latitudeL=0;		//纬度
-				dblocptr->temppush.longitudeH=0;		//经度
-				dblocptr->temppush.longitudeL=0;		//经度
-				dblocptr->temppush.height=0;		//高度
-				dblocptr->temppush.speed=0;			//速度
-				dblocptr->temppush.direction=0;		//方向
-				dblocptr->temppush.timeBCD[0]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[1]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[2]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[3]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[4]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[5]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.signalCmd=0;		//信号关键字
-				dblocptr->temppush.signalCmd_len=0;	//信号关键字长度
-				dblocptr->temppush.CSQ=0;			//信号强度
-				dblocptr->temppush.atellitesCmd=0;	//卫星关键字
-				dblocptr->temppush.atellitesCmd_len=0;//卫星关键字长度
-				dblocptr->temppush.satellitesNum=0;	//卫星数量
-			}
-			else
-			{
-				PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*34),17);
-				TestPrintStruct(dblocptr,1,0);//读取Temp
-				dblocptr->headinfo.loc_pushIndex+=1;
-				dblocptr->headinfo.loc_Conter+=1;
-				Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//更新刻度
-
-			}
-
+		printf("2\r\n");	
+			PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*34),17);
+			dblocptr->headinfo.loc_pushIndex+=1;
+			dblocptr->headinfo.loc_Conter+=1;
+			Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//更新刻度
+			
 		}
 		else if(timecount==4)//20min最少一条
 		{
+		printf("3\r\n");	
 			timecount=0;
-			Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pushIndex-1)*34),17);//读取body信息
-			if(dblocptr->temppush.alarmFlagH==0xFFFF)
-			{
-				dblocptr->temppush.alarmFlagH=0;
-				dblocptr->temppush.alarmFlagL=0;
-				dblocptr->temppush.statusFlagH=0;		//状态标志
-				dblocptr->temppush.statusFlagL=0;		//状态标志
-				dblocptr->temppush.latitudeH=0;		//纬度
-				dblocptr->temppush.latitudeL=0;		//纬度
-				dblocptr->temppush.longitudeH=0;		//经度
-				dblocptr->temppush.longitudeL=0;		//经度
-				dblocptr->temppush.height=0;		//高度
-				dblocptr->temppush.speed=0;			//速度
-				dblocptr->temppush.direction=0;		//方向
-				dblocptr->temppush.timeBCD[0]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[1]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[2]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[3]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[4]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.timeBCD[5]=0;		//时间戳(世纪秒)BCD
-				dblocptr->temppush.signalCmd=0;		//信号关键字
-				dblocptr->temppush.signalCmd_len=0;	//信号关键字长度
-				dblocptr->temppush.CSQ=0;			//信号强度
-				dblocptr->temppush.atellitesCmd=0;	//卫星关键字
-				dblocptr->temppush.atellitesCmd_len=0;//卫星关键字长度
-				dblocptr->temppush.satellitesNum=0;	//卫星数量
-			}
-			else
-			{
-				PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*34),17);
-				TestPrintStruct(dblocptr,1,0);//读取Temp
-				dblocptr->headinfo.loc_pushIndex+=1;
-				dblocptr->headinfo.loc_Conter+=1;
-				Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//更新刻度
-
-			}
+			PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*34),17);
+			dblocptr->headinfo.loc_pushIndex+=1;
+			dblocptr->headinfo.loc_Conter+=1;
+			Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//更新刻度
 		}
-
-		else if(dblocptr->headinfo.loc_pushIndex==0)//判断是否写入
-		{		
-			PushSta = Flash_WriteBytes((uint16_t*)&(dblocptr->location.alarmFlagH),LocDbBodyStart,17);//34
-			if(PushSta==HAL_OK)
-			{
-				printf("首次写入,->%d\r\n",dblocptr->temppush.loc_pushIndex);
-			}
-			dblocptr->headinfo.loc_pushIndex+=1;	//入库索引
-			dblocptr->headinfo.loc_Conter+=1;		//入库总计数
-			Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,6);//向dblocptr->headinfo写入6*2个字节
-			Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.loc_pushIndex),LocDbHeadStart,6);//读取
+		else
+		{
+		printf("4\r\n");	
+			printf("未获取定位信息\r\n");
 		}
-		
 	}
+
 	if(dblocptr->headinfo.loc_pushIndex == dblocptr->headinfo.loc_pushSize)//入库达边界值
 	{
+		printf("5\r\n");	
 		Overwrite_loc=true;
 		dblocptr->headinfo.loc_pushIndex=0;
 		printf("@@入库操作,当前索引%d,达边界值返回覆写----%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_Conter);
 		Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度
 	}
-//	if(dblocptr->location.latitudeL!=0)
-//	{
-		TestPrintStruct(dblocptr,0,0);//读取Worknow
-		Flash_ReadBytes((uint16_t*)&(dblocptr->temppush.loc_pushIndex),LocDbHeadStart,4);//读取loc头部写入信息
-//		if(PushSta==HAL_OK)
-//		{
-			printf("写入%d完成,准备写入->%d\r\n",dblocptr->headinfo.loc_pushIndex-1,dblocptr->temppush.loc_pushIndex);
-//		}
-//	}
-	///*越界处理
-	
+	if(dblocptr->headinfo.loc_pushIndex>0)
+	{
+		printf("6\r\n");	
+		printf("写入%d完成,准备写入->%d\r\n",dblocptr->headinfo.loc_pushIndex-1,dblocptr->headinfo.loc_pushIndex);
+	}
 }
-
+bool lastPull = false;
 void Database_Pull(uint8_t object)
 {
 	if(object==0)//位置信息出库
 	{
+		printf("1\r\n");
 		Flash_ReadBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,6);//读取loc头部写入信息
 
 		if(dblocptr->headinfo.loc_pushIndex != dblocptr->headinfo.loc_pullIndex)//库内有数据
 		{
+		printf("2\r\n");
+			printf("库内有数据\r\n");
 			if(Overwrite_loc)
 			{
-				if(dblocptr->headinfo.loc_pullIndex > dblocptr->headinfo.loc_pushSize)
+				
+		printf("3\r\n");
+				printf("库内已被覆写\r\n");
+				if(dblocptr->headinfo.loc_pullIndex > dblocptr->headinfo.loc_pullSize)//到达界限
 				{
+					
+		printf("4\r\n");
+					twowrite = false;
 					dblocptr->headinfo.loc_pullIndex=0;
 				}
-				else
+				else if(dblocptr->headinfo.loc_pullIndex==0)//当前入库后的一组数据
 				{
+					
+		printf("5\r\n");
+					twowrite = true;
+					printf("更新pullIndex\r\n");
 					dblocptr->headinfo.loc_pullIndex = dblocptr->headinfo.loc_pushIndex+1;
-					printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex);
+
+				}
+				else if(dblocptr->headinfo.loc_pullIndex < dblocptr->headinfo.loc_pushIndex)//置0后
+				{
+					
+		printf("6\r\n");
+					printf("@@前出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex);
 					Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息
-					//TestPrintStruct(dblocptr,2,1);//读取pullTemp
-					//dblocptr->headinfo.loc_pullIndex+=1;
-					Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度
+					dblocptr->headinfo.loc_pullIndex+=1;
+					Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度
 				}
-				if(dblocptr->headinfo.loc_pullIndex < dblocptr->headinfo.loc_pushIndex)
+				else if(dblocptr->headinfo.loc_pullIndex > dblocptr->headinfo.loc_pushIndex)//置0后
 				{
-					printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex);
+					
+		printf("7\r\n");
+					printf("@@0后出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex);
 					Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息
-					//TestPrintStruct(dblocptr,2,1);//读取pullTemp
 					dblocptr->headinfo.loc_pullIndex+=1;
-					Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度
+					Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度
 				}
 			}
 			else
 			{
-				printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex);
+				
+		printf("8\r\n");
+				printf("库内未被覆写,出库\r\n");
 				Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息
-				//TestPrintStruct(dblocptr,2,1);//读取pullTemp
 				dblocptr->headinfo.loc_pullIndex+=1;
-				Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度
+				Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度
 			}
+			//*后一出库
+//			if(twowrite)
+//			{
+//				
+//		printf("9\r\n");
+//				printf("@@后出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex);
+//				Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息
+//				dblocptr->headinfo.loc_pullIndex +=1;
+//				Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度
+//			}
+				
 		}
-		else
+		else if(dblocptr->headinfo.loc_pushIndex == dblocptr->headinfo.loc_pullIndex && Overwrite_loc  && dblocptr->headinfo.loc_Conter>=dblocptr->headinfo.loc_pushSize) //相同已返回总计数大于入库限制
 		{
+			
+		printf("10\r\n");
+			printf("库内有数据并且都在头\r\n");
 			printf("@@出库操作,应出库%d当前索引%d\r\n",dblocptr->headinfo.loc_pushIndex,dblocptr->headinfo.loc_pullIndex);
+			dblocptr->headinfo.loc_pullIndex=dblocptr->headinfo.loc_pushIndex +1;
+			Flash_ReadBytes((uint16_t*)&(dblocptr->temppull.alarmFlagH),LocDbBodyStart + ((dblocptr->headinfo.loc_pullIndex)*34),17);//读取出库body信息
+			Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度
+		}
+		
+		else if(dblocptr->headinfo.loc_pullIndex > dblocptr->headinfo.loc_pullSize)
+		{
+			
+		printf("11\r\n");
 			dblocptr->headinfo.loc_pushIndex=0;
 			dblocptr->headinfo.loc_pullIndex=0;
-			Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度
-			printf("@@出库完成,库内数据更新\r\n");
-			Online=false;
+			Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度
 		}
+		
+		if(dblocptr->headinfo.loc_pushIndex == dblocptr->headinfo.loc_pullIndex)
+		{
+		printf("12\r\n");
+
+				dblocptr->headinfo.loc_pushIndex=0;
+				dblocptr->headinfo.loc_pullIndex=0;
+				Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo.loc_pushIndex),LocDbHeadStart,4);//更新刻度
+				printf("@@出库完成,库内数据更新!!!!\r\n");
+				Online=false;
+	
+		}			
+		printf("13\r\n");
+		printf("@@出库操作当前索引%d\r\n",dblocptr->headinfo.loc_pullIndex);
 	}
 }
 
@@ -351,8 +341,6 @@ void PushpullWork(void)
 #if timingPush==1
 	//if(Offline && timecountMin==5)//5min入库一个信息
 	if(Offline && timecountMin==1)//1min入库一个信息
-#else
-	if(Offline)//入库	
 #endif
 	{
 		timecountMin=0;//5min清0
@@ -361,8 +349,14 @@ void PushpullWork(void)
 	}
 	else if(!Offline && Online)
 	{
-		Database_Pull(0);
-		tt808FsFunc((uint8_t*)&(dblocptr->temppull.alarmFlagH), 39, MessageID_Retrans);
+		Database_Pull(0);//读取
+		if(lastPull)
+		{lastPull=false;}
+		else
+		{
+			tt808FsFunc((uint8_t*)&(dblocptr->temppull.alarmFlagH), 39, MessageID_Retrans);//上传
+		}
+		
 	}
 }
 

+ 3 - 3
Core/Src/freertos.c

@@ -261,8 +261,8 @@ void StartloginfoTaskTask(void const * argument)
 	}
 #endif
 	
-	
-	nomalCount=1;
+	//*30sÉÏ´«ÐÅÏ¢
+	nomalCount+=1;
 	if(nomalCount==3)
 	{
 		nomalCount=0;
@@ -273,7 +273,7 @@ void StartloginfoTaskTask(void const * argument)
 	}
 #if timingPush ==1
 	timecountSec+=1;
-	if(timecountSec==5)//1min
+	if(timecountSec==6)//1min
 	{
 		timecountSec=0;//Çå0
 		timecountMin+=1;//¼Ó1min

+ 4 - 1
Core/Src/main.c

@@ -52,6 +52,7 @@ extern Menu_table menu;
 void Jump_interface_PDA(void);
 
 uint16_t sys_mode[2];
+bool wdiFlag = false;
 
 /* USER CODE END PM */
 
@@ -220,9 +221,11 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
     HAL_IncTick();
   }
   /* USER CODE BEGIN Callback 1 */
-  
+  if(!wdiFlag)
+  {
 	//ι¿´ÃŹ·
 	TOGGLE_WDI_PIN(&htim2);    
+  }
   /* USER CODE END Callback 1 */
 }
 

+ 27 - 2
Core/Src/ml307a.c

@@ -30,8 +30,9 @@ char hour_str[3];
 char minute_str[3];
 char second_str[3];
 
+extern char Newip[30];
 
-
+extern Ipaddr ipaddr;
 //*本模块方法
 void ML307AReset(void);
 void RTCtime(void);
@@ -56,6 +57,23 @@ void ML307A_Init(void)
 	{
 		//
 	}
+	
+	Flash_ReadBytes((uint16_t*)&(ipaddr.IP0),ReIPAddr,5);//读取phonenum
+	if(ipaddr.IP0==0xFFFF)
+	{
+		
+	}
+	else
+	{
+		char *ptr = Newip;
+		ptr += sprintf(ptr, "%d.", ipaddr.IP0);
+		ptr += sprintf(ptr, "%d.", ipaddr.IP1);
+		ptr += sprintf(ptr, "%d.", ipaddr.IP2);
+		ptr += sprintf(ptr, "%d", ipaddr.IP3);	
+	}
+
+	
+	
 
 	printf("\t###02\t4G_init...%d\r\n",resetcount_4g); 
 	sendCmd_4G("AT+MGNSS=0\r\n", "OK", 1, 1);//关闭MGNSS
@@ -117,7 +135,14 @@ void ML307A_Init(void)
 			}
 			
 			char TCPconnvalue[100];
-			TcpConn(TCPconnvalue, 1, JLPTIP, JLPTPORT,0);		//cid=1		tcpConnmode=0 普通模式
+			if(Newip[0] == NULL)
+			{
+				TcpConn(TCPconnvalue, 1, JLPTIP, JLPTPORT,0);		//cid=1		tcpConnmode=0 普通模式
+			}
+			else
+			{
+				TcpConn(TCPconnvalue, 1, Newip, ipaddr.IPp,0);		//cid=1		tcpConnmode=0 普通模式
+			}
 			if(sendCmd_4G(TCPconnvalue, "+MIPOPEN: 1,0", 1, 1))	//TCP连接 0普通模式  2缓存模式  1透传模式
 #endif
 			{

+ 130 - 54
Core/Src/tt808.c

@@ -297,34 +297,88 @@ void extractString(char* receiveStr, char* result, uint8_t start, uint16_t end)
   }
 }
 
+void extractStringPoint(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(start==0 && end==1)// = -> .
+	  {
+		start_index = start; // 第start个逗号之后的字符
 
-void process_string(char** input_strings, char** output_strings, int start_index, int end_index) {
-    char* start_ptr;
-    char* end_ptr;
-    char* input = input_strings[start_index];
-    int count = 0;
-    
-    if (start_index == 4) {
-        start_ptr = strchr(input, ':') + 1; // 寻找第一个冒号,并指向冒号后的字符
-        count = sscanf(start_ptr, "%d", &output_strings[4]);
-    } else {
-        start_ptr = strchr(input, '=') + 1; // 寻找第一个等号,并指向等号后的字符
-        for (int i = 0; i <= end_index; i++) {
-            end_ptr = strchr(start_ptr, '.');  // 寻找下一个点号,并指向点号后的字符
-            if (end_ptr == NULL) {
-                end_ptr = strchr(start_ptr, '\0');  // 如果是最后一个区间,指向字符串末尾
-            }
-            if (end_ptr != NULL) {
-                *end_ptr = '\0';  // 将点号替换为字符串结束符,截断字符串
-                count = sscanf(start_ptr, "%d", &output_strings[i]);
-                start_ptr = end_ptr + 1;  // 移动指针到下一个区间的开头
-            } else {
-                break;
-            }
-        }
-    }
+		if (receiveStr[i] == '.')
+		{
+			comma_count++;	
+		}
+		else if (comma_count == end)
+		{
+			end_index = i-1; // 第end个逗号之前的字符
+			break;
+		}
+	  }
+	  else if(start==3 && end==4)
+	  {
+		  if (receiveStr[i] == '.')
+		  {
+			  comma_count++;
+			  if (comma_count == start)
+			  {
+				  start_index = i + 1; // 第start个逗号之后的字符
+			  }
+		  }
+		  else if(receiveStr[i] == ':')
+		  {
+			  end_index = i;
+		  }
+	  }
+	  else if(start==4 && end==5)
+	  {
+		  if (receiveStr[i] == ':')
+		  {
+			comma_count=4;
+			if (comma_count == start)
+			{
+				start_index = i+1; // 第start个逗号之后的字符
+			}
+			end_index = start_index+4;
+			break;
+		}
+	  }
+	  
+	  else
+	  {
+			if (receiveStr[i] == '.')
+			{
+			  comma_count++;
+			  if (comma_count == start)
+			  {
+				start_index = i + 1; // 第start个逗号之后的字符
+			  }
+			  else if (comma_count == end)
+			  {
+				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) {
 	if(str == csatellitesNum)
 	{
@@ -397,13 +451,16 @@ void hexToBcd_arr(uint8_t* array, size_t length, uint8_t* out) {//通
         out[i] = hexToBcd(array[i]);
     }
 }
-char* input_strings[]={0};
-char* reIp0[5];
-char* reIp1[5];
-char* reIp2[5];
-char* reIp3[5];
-char* reIpP[5];
-
+char input_strings[20]={0};
+char reIp0[10];
+char reIp1[10];
+char reIp2[10];
+char reIp3[10];
+char reIpP[10];
+Ipaddr ipaddr;
+char Newip[30];
+extern bool wdiFlag;
+//*485测试命令
 void Test485Re(void)
 {
 	//*test485 模拟
@@ -449,26 +506,48 @@ void Test485Re(void)
 	 }
 	 else if(strncmp((char*)U1_485recvBuff, "DTU+IP",  strlen("DTU+IP"))==0)
 	 {
-		printf("更换IP\r\n");
 		memcpy(input_strings,U1_485recvBuff+7,20);
-//		process_string(input_strings,reIp0,0,1);//获取192
-//		process_string(input_strings,reIp1,1,2);//获取168
-//		process_string(input_strings,reIp2,2,3);//获取1
-//		process_string(input_strings,reIp3,3,4);//获取2
-//		process_string(input_strings,reIpP,4,5);//获取port
+
+		extractStringPoint(input_strings,reIp0,0,1);
+		extractStringPoint(input_strings,reIp1,1,2);
+		extractStringPoint(input_strings,reIp2,2,3);
+		extractStringPoint(input_strings,reIp3,3,4);
+		extractStringPoint(input_strings,reIpP,4,5);
+
+		ipaddr.IP0 = atoi(reIp0);
+		ipaddr.IP1 = atoi(reIp1);
+		ipaddr.IP2 = atoi(reIp2);
+		ipaddr.IP3 = atoi(reIp3);
+		ipaddr.IPp = atoi(reIpP);
+		//printf("%d.%d.%d.%d:%d",ipaddr.IP0,ipaddr.IP1,ipaddr.IP2,ipaddr.IP3,ipaddr.IPp);
+		HAL_StatusTypeDef writeSta = Flash_WriteBytes((uint16_t*)&(ipaddr.IP0),ReIPAddr,5);
+		 if(writeSta == HAL_OK)
+		 {
+			char *ptr = Newip;
+			ptr += sprintf(ptr, "%d.", ipaddr.IP0);
+			ptr += sprintf(ptr, "%d.", ipaddr.IP1);
+			ptr += sprintf(ptr, "%d.", ipaddr.IP2);
+			ptr += sprintf(ptr, "%d", ipaddr.IP3);
+			printf("更换IP成功!\r\n");
+		 }
+		//ptr += sprintf(ptr, ":%d", ipaddr.IPp);
+		//printf("%s\r\n",Newip);
 		memset(U1_485recvBuff,0,BUFFER_SIZE);
+		HAL_Delay(500);
+		printf("即将重启\r\n");
+		wdiFlag = true;
 	 }
 }
+
+//*工作命令
 void ReMIPURC(void)
 {
-//*工作
-
 //*设备上线,发送成功
 	 if(strncmp((char*)U4_4GrecvBuff, "+MIPOPEN: 1,0",  strlen("+MIPOPEN: 1,0"))==0)//连接平台
 	 {
-//		 Offline=false;	//待判定假消息
-//		 Online = true;	//待判定假消息
-//		 uploaweork=true;
+		 Offline=false;	//待判定假消息
+		 Online = true;	//待判定假消息
+		 uploaweork=true;
 		 printf("@TCP连接成功!!\r\n");
 		 memset(U4_4GrecvBuff,0,BUFFER_SIZE);
 	 }	 
@@ -501,7 +580,7 @@ void ReMIPURC(void)
 		 printf("@未发送成功,平台断开连接\r\n");
 		 memset(U4_4GrecvBuff,0,BUFFER_SIZE);
 		 uploaweork = false;
-		 reconn();//重连
+		 //reconn();//重连
 	 }
 	 else if((strncmp((char*)U4_4GrecvBuff, "+CPIN: SIM REMOVED", strlen("+CPIN: SIM REMOVED"))==0) || (strncmp((char*)U4_4GrecvBuff, "+CME ERROR: 10", strlen("+CME ERROR: 10"))==0) )//无SIM
 	 {
@@ -530,25 +609,22 @@ void ReMIPURC(void)
 	 }
 	 else if( (strncmp((char*)U4_4GrecvBuff, "+CME ERROR: 550", strlen("+CME ERROR: 550"))==0))
 	 {
-		Offline=true;
-		signal = false;
+		//Offline=true;
+		//signal = false;
 		printf("@未发送成功->TCP/IP未知错误\r\n");
 		memset(U4_4GrecvBuff,0,BUFFER_SIZE);
-		 uploaweork = false;
-		 reconn();//重连
-		 
-		 
-		 
+		 //uploaweork = false;
+		 //reconn();//重连
 		 
 	 }
 	 else if((strncmp((char*)U4_4GrecvBuff, "+MIPOPEN: 1,571", strlen("+MIPOPEN: 1,571"))==0))//PDP激活失败
 	 {
 		//TODO
-		Offline=true;
+		//Offline=true;
 		printf("@未发送成功,PDP激活失败\r\n");
 		memset(U4_4GrecvBuff,0,BUFFER_SIZE);
-		 uploaweork = false;
-		 reconn();//重连
+		 //uploaweork = false;
+		// reconn();//重连
 	 }
 #endif
 	 else if(U4_4GrecvBuff[1]== 0x43 && U4_4GrecvBuff[2]== 0x53 && U4_4GrecvBuff[3]== 0x51)//CSQ 信号

+ 10 - 5
MDK-ARM/dtu.uvoptx

@@ -153,27 +153,32 @@
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>reIp</ItemText>
+          <ItemText>reIp0</ItemText>
         </Ww>
         <Ww>
           <count>1</count>
           <WinNumber>1</WinNumber>
-          <ItemText>reIp0</ItemText>
+          <ItemText>reIp1</ItemText>
         </Ww>
         <Ww>
           <count>2</count>
           <WinNumber>1</WinNumber>
-          <ItemText>reIp1</ItemText>
+          <ItemText>reIp2</ItemText>
         </Ww>
         <Ww>
           <count>3</count>
           <WinNumber>1</WinNumber>
-          <ItemText>reIp2</ItemText>
+          <ItemText>reIp3</ItemText>
         </Ww>
         <Ww>
           <count>4</count>
           <WinNumber>1</WinNumber>
-          <ItemText>reIp3</ItemText>
+          <ItemText>input_strings</ItemText>
+        </Ww>
+        <Ww>
+          <count>5</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>reIpP</ItemText>
         </Ww>
       </WatchWindow1>
       <WatchWindow2>