ソースを参照

add 0200cmd

zack 1 年間 前
コミット
5420d0b53e
共有21 個のファイルを変更した552 個の追加486 個の削除を含む
  1. 62 25
      Core/Inc/ConfigMacros.h
  2. 7 6
      Core/Inc/database.h
  3. 5 0
      Core/Inc/interface.h
  4. 1 1
      Core/Inc/mba32a.h
  5. 3 0
      Core/Inc/ml307a.h
  6. 3 0
      Core/Inc/oledfont.h
  7. 1 1
      Core/Inc/rtc.h
  8. 3 6
      Core/Inc/tt808.h
  9. 1 3
      Core/Inc/usart.h
  10. 53 229
      Core/Src/database.c
  11. 31 6
      Core/Src/freertos.c
  12. 13 0
      Core/Src/interface.c
  13. 1 1
      Core/Src/key.c
  14. 0 7
      Core/Src/main.c
  15. 100 47
      Core/Src/mba32a.c
  16. 26 12
      Core/Src/ml307a.c
  17. 1 1
      Core/Src/rtc.c
  18. 1 3
      Core/Src/stm32f1xx_it.c
  19. 180 130
      Core/Src/tt808.c
  20. 35 3
      Core/Src/usart.c
  21. 25 5
      MDK-ARM/dtu.uvoptx

+ 62 - 25
Core/Inc/ConfigMacros.h

@@ -7,6 +7,7 @@
 #include "ml307a.h"
 #include <stdlib.h>
 #include "interface.h"
+#include <math.h>
 
 #define BUFFER_SIZE 256
 #define open4G			1	
@@ -52,9 +53,9 @@
 //*tt808
 #define JLPTIP		"121.199.29.128"
 #define JLPTPORT	7342
-#define XXID_zdjq	0x0102 //鉴权
-#define XXID_zdxt	0x0002 //心跳
-#define XXID_zddz	0x0200 //地址
+#define MessageID_authentication	0x0102 //鉴权
+#define MessageID_heartbeat			0x0002 //心跳
+#define MessageID_location			0x0200 //地址
 #define TCPJMFSRSA  0x001
 #define TCPJMFSNULL 0x000
 
@@ -174,7 +175,9 @@ typedef enum {
 	Working =6,
 	FinshOK =7,
 	Fail4G =8,
-	Nosignal =9
+	Nosignal =9,
+	Disconn = 0xA,
+	Back = 0xB
 } TipsFlag;
 
 struct keys
@@ -222,43 +225,77 @@ typedef enum {
 } BtStep;
 
 typedef struct {
-    uint8_t LSH;
 	
+	uint8_t LSH;
 	uint8_t Rtime[6];
-	
 	uint32_t C_Seconds;
 	uint8_t L1Lockstatus;
 	uint8_t L2Lockstatus;
 	uint8_t L3Lockstatus;
 	uint8_t L4Lockstatus;
 	
-	uint16_t Speed;
-	uint32_t WD_u32;
-	uint32_t JD_u32;
 } TT808;
 
+
+
 typedef struct {
+    uint32_t timeStamp;		//时间戳(世纪秒)
 	
-	uint16_t LOC_InitInfo[4];	//0xFA0 	//4000 * 14B
-	uint16_t EVE_InitInfo[4];	//0x7D0		//2000 * 28B
-	
-	uint16_t timeStamp[2];		//时间戳(世纪秒)
-	
-	uint16_t WD_u16[2];
-	uint16_t JD_u16[2];
+	//*上传数据
+	uint64_t alarmFlag;		//报警标志
+	uint64_t statusFlag;	//状态标志
+    uint32_t latitude;		//纬度
+    uint32_t longitude;		//经度
+    uint16_t speed;			//速度
+	uint16_t signalCmd_len;	//信号关键字长度
+	uint8_t CSQ;			//信号强度
+	uint16_t atellitesCmd_len;//卫星关键字长度
+	uint8_t satellitesNum;	//卫星数量
+} LocationData;
+
+typedef struct {
+    uint16_t loc_pushIndex;		//入库指针
+    uint16_t loc_pullIndex;		//出库指针
+    uint16_t loc_pushSize;		//入库刻度
+    uint16_t loc_pullSize;		//出库刻度
 	
-	//*位置db使用
-	uint16_t speed[1];				//速度
+    uint16_t eve_pushIndex;		//入库指针
+    uint16_t eve_pullIndex;		//出库指针
+    uint16_t eve_pushSize;		//入库刻度
+    uint16_t eve_pullSize;		//出库刻度
+} Headinfo;
+
+
+typedef struct {
+    uint16_t loc_pushIndex;		//入库指针
+    uint16_t loc_pullIndex;		//出库指针
+    uint16_t loc_pushSize;		//入库刻度
+    uint16_t loc_pullSize;		//出库刻度
 	
-	//*状态db使用
-	uint16_t LockSn[3];			//锁编号
-	uint16_t OperationType[1];		//操作类型
-	uint16_t OperationResults[1];	//操作结果
-	uint16_t perators[2];		//操作人
-	uint16_t ElectricityLevel[1];	//电量
+    uint16_t eve_pushIndex;		//入库指针
+    uint16_t eve_pullIndex;		//出库指针
+    uint16_t eve_pushSize;		//入库刻度
+    uint16_t eve_pullSize;		//出库刻度
+
 	
-} Database;
+} TestTemp;
+
+typedef struct {
+	Headinfo headinfo;
+    LocationData location;
+    TestTemp temp;
+} DatabaseLoc;
 
 
+typedef struct {
+    Headinfo headinfo;
+    LocationData location;
+    uint64_t LockSn;			//锁编号
+    uint16_t OperationType;		//操作类型
+    uint16_t OperationResults;	//操作结果
+    uint32_t perators;			//操作人
+    uint16_t ElectricityLevel;	//电量
+    TestTemp temp;
+} DatabaseEvent;
 #endif /*__CONFIGMACROS_H*/
 

+ 7 - 6
Core/Inc/database.h

@@ -7,15 +7,16 @@
 
 
 
-void Database_init(uint16_t pushSize1, uint16_t pullSize1 ,uint16_t pushSize2, uint16_t pullSize2);
-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);
+void Database_init(uint16_t pushsize_loc, uint16_t pullsize_loc,uint16_t pushsize_eve, uint16_t pullsize_eve);
 
+void Database_Push(uint8_t ptr);
 
 
+extern DatabaseLoc *dblocptr;
+extern DatabaseEvent *dbeveptr;
+
+
+extern uint16_t PDA_pushArr[1024];
 
 #endif /*__DATABASE_H*/
 

+ 5 - 0
Core/Inc/interface.h

@@ -14,5 +14,10 @@ extern bool L3bd ;						//L3
 extern bool L4bd ;						//L4°ó¶¨±ê־λ	
 extern uint8_t Developer_PortalA;
 extern uint8_t Developer_PortalD;
+
+
+extern bool btconn_dtu;
+
+
 #endif /*__INTERFACE_H*/
 

+ 1 - 1
Core/Inc/mba32a.h

@@ -15,7 +15,7 @@ void Lock_OandC(void);
 uint8_t sendCmd_BT(char *pCmd,char *pRes, uint32_t timeOut, uint8_t sendNum);
 
 
-extern char autoRe[50];
+extern char autoRe[1024];
 void ReU5Proces(void);
 
 void event_lock(void);

+ 3 - 0
Core/Inc/ml307a.h

@@ -22,5 +22,8 @@ extern char hour_str[3];
 extern char minute_str[3];
 extern char second_str[3];
 extern bool signal;
+void ML307AReset(void);
+
+extern uint8_t TimeBCD[6];
 #endif /*__ML307A_H*/
 

+ 3 - 0
Core/Inc/oledfont.h

@@ -454,6 +454,9 @@ const unsigned char Hzk1[][32]={
 {0x00,0xFE,0x02,0xFA,0x02,0xFE,0x40,0x20,0xD8,0x17,0x10,0x10,0xF0,0x10,0x10,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x80,0x40,0x21,0x16,0x08,0x16,0x21,0x40,0x80,0x00},/*"啖",47*/
 {0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x42,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00,0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,0x4F,0x48,0x48,0x48,0x48,0x4F,0x40,0x00},/*"閉",48*/
 {0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00},/*"奀",49*/
+{0x00,0xFC,0x20,0x24,0xA8,0xFF,0xA8,0x24,0x00,0xFC,0x44,0x44,0xC4,0x42,0x40,0x00,0x00,0x3F,0x22,0x21,0x20,0x2F,0x20,0xA3,0x60,0x1F,0x00,0x00,0xFF,0x00,0x00,0x00},/*"剿",50*/
+{0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00},/*"羲",51*/
+
 
 
 };

+ 1 - 1
Core/Inc/rtc.h

@@ -41,7 +41,7 @@ extern RTC_HandleTypeDef hrtc;
 void MX_RTC_Init(void);
 
 /* USER CODE BEGIN Prototypes */
-void tongbushijian(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minutes, uint8_t seconds);
+void SyncTime(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minutes, uint8_t seconds);
 /* USER CODE END Prototypes */
 
 #ifdef __cplusplus

+ 3 - 6
Core/Inc/tt808.h

@@ -15,15 +15,12 @@ void ReMIPURC(void);
 void time_bj(void);
 void ReU4Proces(void);
 
+void printBytes(uint8_t *data, size_t length);
 
 
+uint8_t testHex2Asc(const char *hex) ;
 
-
-
-
-
-
-
+void hexArrayToBcd(uint8_t* array, size_t length, uint8_t* out);
 
 
 

+ 1 - 3
Core/Inc/usart.h

@@ -70,14 +70,12 @@ void MX_USART3_UART_Init(void);
 
 /* USER CODE BEGIN Prototypes */
 void Printf_u4u5logbyU1(void);
-//void Write_Info64(uint32_t addr, uint64_t newValue);
-//void Write_Info08(uint32_t addr, uint8_t newValue);
-//uint8_t Read_flash_6(uint32_t addr, uint8_t* data_ptr);
 uint8_t xorBytes(uint8_t arr[], int size);
 void sendCombinedArray(uint8_t *header, size_t headerLength, uint8_t *command, size_t commandLength, bool JM);
 
 HAL_StatusTypeDef Flash_WriteBytes(uint16_t* sorBuf, uint32_t FlashAddr, uint16_t len);
 void Flash_ReadBytes(uint16_t* sorBuf,uint32_t FlashAddr,uint16_t len);
+uint32_t convertGPS(double temp) ;
 /* USER CODE END Prototypes */
 
 #ifdef __cplusplus

+ 53 - 229
Core/Src/database.c

@@ -1,274 +1,98 @@
 #include "database.h"
 #include "usart.h"
 
-Database db;
-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_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)  //位置信息身体
 
-// EveDbHeadStart	((uint32_t)0x8070000)  //状态信息头部
-// EveDbBodyStart	((uint32_t)0x8070800)  //状态信息身体
+DatabaseLoc dbloc;
+DatabaseEvent dbeve;
+DatabaseLoc *dblocptr = &dbloc;
+DatabaseEvent *dbeveptr = &dbeve;
+
 
 /**
   * @breaf 数据库初始化
   * @Explanation 向各头部写入关键信息
   */
-void Database_init(uint16_t pushSize1, uint16_t pullSize1 ,uint16_t pushSize2, uint16_t pullSize2)
+void Database_init(uint16_t pushsize_loc, uint16_t pullsize_loc,uint16_t pushsize_eve, uint16_t pullsize_eve)
 {
-	
-	Flash_ReadBytes(db.LOC_InitInfo,LocDbHeadStart,4);
-	if(db.LOC_InitInfo[0]==0xffff && db.LOC_InitInfo[2]==0xffff)//未进行写入
+	Flash_ReadBytes((uint16_t*)&(dblocptr->temp.loc_pushIndex),LocDbHeadStart,4);//读取loc头部是否发生写入
+	if(dblocptr->temp.loc_pullIndex == 0xFFFF && dblocptr->temp.loc_pushIndex==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[2] = (uint16_t)pushSize1;
-		db.LOC_InitInfo[3] = (uint16_t)pullSize1;
-		Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,4);//4*2B
-		HAL_Delay(200);
+		dblocptr->headinfo.loc_pushIndex = 0;
+		dblocptr->headinfo.loc_pullIndex = 0;
+		dblocptr->headinfo.loc_pushSize = pushsize_loc;
+		dblocptr->headinfo.loc_pullSize = pullsize_loc;
+		Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);
 	}
-	else//已写入
+	else
 	{
-		//TODO
+		//*高地址字节在前
+		dblocptr->headinfo.loc_pushIndex = dblocptr->temp.loc_pushIndex;
+		dblocptr->headinfo.loc_pullIndex = dblocptr->temp.loc_pushIndex;
+		dblocptr->headinfo.loc_pushSize =  dblocptr->temp.loc_pushSize;
+		dblocptr->headinfo.loc_pullSize =  dblocptr->temp.loc_pullSize;
 	}
 
 	
-	Flash_ReadBytes(db.EVE_InitInfo,EveDbHeadStart,4);
-	if(db.EVE_InitInfo[0]==0xffff && db.EVE_InitInfo[2]==0xffff)//未进行写入
-	{
-		//*EVE_InitInfo 0:pushIndex 1:pullIndex 2:pushSize 3:pullSize
-		db.EVE_InitInfo[0] = (uint16_t)0;
-		db.EVE_InitInfo[1] = (uint16_t)0;
-		db.EVE_InitInfo[2] = (uint16_t)pushSize2;
-		db.EVE_InitInfo[3] = (uint16_t)pullSize2;
-		Flash_WriteBytes(db.EVE_InitInfo,EveDbHeadStart,4);//4*2B
-		HAL_Delay(200);
-	}
-	else//已写入
-	{
-		//TODO
-	}
 	
-}
-
-/*
- *  
-  uint16_t pushArr[7]={0x1234,0x4567, 0x1111,0x2222,0x3333,0x4444, 0xAAAA};
-  Database_Push(pushArr,7);
-  Database_Pull(pullArr,7);
-  uint16_t pullArr[7]={0};
- */
-HAL_StatusTypeDef PushSta;
-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 Init
-	{
-		PushSta = Flash_WriteBytes(pushArr,LocDbBodyStart,len);//len*2B
-		if(PushSta == HAL_OK)
-		{
-			db.LOC_InitInfo[0] += 1;
-			Flash_WriteBytes(db.LOC_InitInfo,LocDbHeadStart,1);//1*2B
-		}
-	}
-	//*读取缓存检测
-	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])//做相同检测
+	Flash_ReadBytes((uint16_t*)&(dbeveptr->temp),EveDbHeadStart,4);//读取loc头部是否发生写入
+	if(dbeveptr->temp.eve_pushIndex == 0xFFFF && dbeveptr->temp.eve_pullIndex ==0xFFFF)//未写入
 	{
-		//*数据一样无需写入操作
+		dbeveptr->headinfo.eve_pushIndex = 0;
+		dbeveptr->headinfo.eve_pullIndex = 0;
+		dbeveptr->headinfo.eve_pushSize = pushsize_loc;
+		dbeveptr->headinfo.eve_pullSize = pullsize_loc;
+		Flash_WriteBytes((uint16_t*)&(dbeveptr->headinfo),EveDbHeadStart,4);
 	}
-	else 
-	{
-		if(Overwrite_pushindex)//重头,避免多次写入
-		{
-			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_Loc(uint16_t pullArr[], uint16_t len)//14B
-{
-	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//更新出库指针
-	}
-
 	else
 	{
-		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//更新出库指针
-		}
-
+		//*高地址字节在前
+		dbeveptr->headinfo.eve_pushIndex = dbeveptr->temp.eve_pushIndex;
+		dbeveptr->headinfo.eve_pullIndex = dbeveptr->temp.eve_pullIndex;
+		dbeveptr->headinfo.eve_pushSize =  dbeveptr->temp.eve_pushSize;
+		dbeveptr->headinfo.eve_pullSize =  dbeveptr->temp.eve_pullSize;
 	}
-	RecordScale();
-}
-
 
+}
 
 
-//***************状态信息入库
-void Database_Push_Eve(uint16_t pushArr[], uint16_t len)
+HAL_StatusTypeDef PushSta;
+//***************定位信息入库
+void Database_Push(uint8_t ptr)
 {
-	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(ptr==0)//位置信息写入
 	{
-		if(Overwrite_pushindex_Eve)//重头,避免多次写入
+		if(dblocptr->headinfo.loc_pushIndex!=0)
 		{
-			Overwrite_pushindex_Eve = false;
+			Flash_ReadBytes((uint16_t*)&(dblocptr->temp.timeStamp),LocDbBodyStart + ((dblocptr->headinfo.loc_pushIndex-1)*14),7);//读取body信息
+			if(dblocptr->temp.latitude == dblocptr->location.latitude)//相同纬度参数(包含未获取定位为0)
+			{
+				//*相同不做操作
+			}
+			else
+			{
+				Flash_WriteBytes((uint16_t*)&(dblocptr->location),LocDbBodyStart + (dblocptr->headinfo.loc_pushIndex*14),7);
+				dblocptr->headinfo.loc_pushIndex+=1;
+				Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度
+			}
 		}
 		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
-			}
+				Flash_WriteBytes((uint16_t*)&(dblocptr->location),LocDbBodyStart,7);
+				dblocptr->headinfo.loc_pushIndex+=1;
+				Flash_WriteBytes((uint16_t*)&(dblocptr->headinfo),LocDbHeadStart,4);//更新刻度
 		}
 	}
-	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;
-	}
 	
 }
+//出库 7e0704002701820200777700060001000022000000000000000301cd8b7007278acd00000000000023051918174830011e310103b77e
 
 
-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 写入操作
-		
-
-}
 
 

+ 31 - 6
Core/Src/freertos.c

@@ -40,7 +40,6 @@ extern BtFrame btframe;
 extern LockInfo lockinfo;
 extern Menu_table menu;	
 extern bool refresh;
-extern Database db;
 extern TipsFlag tipsflag;	
 /* USER CODE END PTD */
 
@@ -190,8 +189,13 @@ void StarBT4GTask(void const * argument)
   /* Infinite loop */
   for(;;)
   {
-    osDelay(300000);
-	  
+    osDelay(9000);	
+	if(MgnssFlag)
+	{
+		USART_SendString(&huart4, "AT+CSQ\r\n");
+		osDelay(100);
+		USART_SendString(&huart4, "AT+MGNSSLOC\r\n");
+	}
 
 
 
@@ -213,13 +217,29 @@ void StartTestTask(void const * argument)
   /* Infinite loop */
   for(;;)
   {
-    osDelay(10000);    
+    osDelay(30000);    
 	if(MgnssFlag)
 	{
-		USART_SendString(&huart4, "AT+MGNSSLOC\r\n");
+		uint8_t testdata[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+							  (dblocptr->location.latitude >> 24) & 0xFF, (dblocptr->location.latitude >> 16) & 0xFF,
+							  (dblocptr->location.latitude >> 8) & 0xFF, (dblocptr->location.latitude) & 0xFF,
+							  (dblocptr->location.longitude >> 24) & 0xFF, (dblocptr->location.longitude >> 16) & 0xFF,
+							  (dblocptr->location.longitude >> 8) & 0xFF, (dblocptr->location.longitude) & 0xFF,
+							  0x00, 0x00, (dblocptr->location.speed >> 8) & 0xFF,
+							  (dblocptr->location.speed) & 0xFF, 0x00, 0x00,
+							  TimeBCD[0], TimeBCD[1], TimeBCD[2], TimeBCD[3], TimeBCD[4], TimeBCD[5]};
+		
+		//*test			  
+	//	size_t length = sizeof(testdata) / sizeof(testdata[0]);
+	//    printf("Bytes in testdata array:\n");
+	//	printBytes(testdata,length);
+			
+		tt808FsFunc(testdata, 28, MessageID_location);
+						  
 	}
 	//testLoc();
-	testEve();
+	//testEve();
+	//Database_Push(0);
 
   }
   /* USER CODE END StartTestTask */
@@ -240,6 +260,11 @@ void StartloginfoTaskTask(void const * argument)
   {
     osDelay(1);
 
+	 if(tipsflag == ConnOK || tipsflag == Disconn)
+	 {
+		HAL_Delay(2000);
+		menu.current=0;
+	 }
 	Printf_u4u5logbyU1();//´òÓ¡log
 	ReMIPURC();
 	ReU4Proces();

+ 13 - 0
Core/Src/interface.c

@@ -19,6 +19,7 @@ bool L1bd = false;						//L1
 bool L2bd = false;						//L2绑定标志位
 bool L3bd = false;						//L3绑定标志位
 bool L4bd = false;						//L4绑定标志位	
+bool btconn_dtu = false;
 
 //字符串
 unsigned char NOSETLOCK[] = "null";
@@ -195,6 +196,10 @@ void Jump_interface(void)
 				//OLED_ShowString(29, 0, welcome, 16, 0);
 				//home(menu.home,L1bd,L2bd,L3bd,L4bd);
 				OLED_ShowPicture(0,0,128,64,BMP7,1);    
+				if(!btconn_dtu)
+				{
+					OLED_ShowString(70, 0, "NoConnect", 12, 1);
+				}
 				break;
 			}
 			
@@ -558,6 +563,14 @@ void WarningTip(void)
 			OLED_ShowChinese(47,32,42,16,1);//接
 			OLED_ShowChinese(64,32,48,16,1);//超
 			OLED_ShowChinese(81,32,49,16,1);//时
+            break;
+		}
+		case Disconn:
+		{
+			OLED_ShowChinese(30,32,50,16,1);//断
+			OLED_ShowChinese(47,32,51,16,1);//开
+			OLED_ShowChinese(64,32,41,16,1);//连
+			OLED_ShowChinese(81,32,42,16,1);//接
             break;
 		}
 		case Working:

+ 1 - 1
Core/Src/key.c

@@ -762,7 +762,7 @@ uint8_t KEY_3_Scan_DTU(void)
 									printf("¿ªÆô¹ã²¥\r\n");
 								}
 							}
-							Flash_WriteBytes(sys_mode,SysModeAddr,1);
+							Flash_WriteBytes(&sys_mode[1],SysModeAddr,1);
 							menu.current=0;//»Øµ½³õʼ
 							refresh=true;
 							break;

+ 0 - 7
Core/Src/main.c

@@ -124,19 +124,12 @@ int main(void)
   __HAL_UART_ENABLE_IT(&huart5, UART_IT_RXNE);//¿ªÆôBT½ÓÊÕÖжÏ
 
   START_PROCESS();
-  //Database_init(0xFA0,0xFA0,0x7D0,0x7D0);
   Database_init(0x5,0x5,0x5,0x5);
   
-
-  
   MBA32A_Init();
   reset4Gmodule = true;
     
 
-
-//menu.current=0;
-//OLED_Refresh();
-
   /* USER CODE END 2 */
 
   /* Call init function for freertos objects (in freertos.c) */

+ 100 - 47
Core/Src/mba32a.c

@@ -12,7 +12,6 @@ BtFrame btframe;
 extern Menu_table menu;	
 extern TT808 tt808;
 extern TipsFlag tipsflag;	
-extern Database db;
 
 //*整型
 uint8_t resetcount_bt=0;
@@ -26,7 +25,7 @@ bool L3Working = false;
 bool L4Working = false;
 
 //*字符串
-char autoRe[50];
+char autoRe[1024];
 
 
 //*外部方法
@@ -105,10 +104,15 @@ void MBA32A_Init(void)
 	printf("\t###01\tBT_init%d...\r\n", resetcount_bt); 
 	
 	Start_Read_resetFlag16();/** 启动位读写检查 **/
-	if(sendCmd_BT("AT+DISCONN=0\r\n","ERROR",1,1))//断开连接
-	{
-		printf("#已无设备连接\n");
-	}
+//	if(sendCmd_BT("AT+DISCONN=0\r\n","ERROR",1,1))//断开连接
+//	{
+//		if(sendCmd_BT("AT+DISCONN=1\r\n","ERROR",1,1))//断开连接
+//		{
+//			printf("#已无主设备连接\n");
+//		}
+//		printf("#已无从设备连接\n");
+//		
+//	}
 	switch(btstep)
 	{
 		case BtStepDefault:
@@ -170,18 +174,7 @@ void MBA32A_Init(void)
 					printf("#04设置发射功率成功\n");
 					btstep++;
 				}
-				
-				
-				
-				
-				
-				
-//				if(sendCmd_BT("AT+CONN=101000000010\r\n","+CONNECTED:0,101000000010",1,1))
-//				{
-//					printf("#05连接成功\n");
-//					btstep++;
-//				}				
-				
+
 				
 				
 			}
@@ -194,9 +187,8 @@ void MBA32A_Init(void)
 			
 	}
 
-	//关闭4G后需要取消注释
-//	menu.current=0;//回到初始
-//	refresh=true;
+
+	
 
 }
 /**
@@ -300,10 +292,10 @@ void close_lock(void)		//
 	close_CMD[9]= userid & 0xff;											
 	
 	RTCtime();						
-	close_CMD[10]= (db.timeStamp[0]>>8) & 0xff;
-	close_CMD[11]= (db.timeStamp[0]) & 0xff;
-	close_CMD[12]= (db.timeStamp[1]>>8) & 0xff;
-	close_CMD[13]= (db.timeStamp[1]) & 0xff;										
+	close_CMD[10]= ((dblocptr->location.timeStamp)>>24) & 0xff;
+	close_CMD[11]= ((dblocptr->location.timeStamp)>>16) & 0xff;
+	close_CMD[12]= ((dblocptr->location.timeStamp)>>8) & 0xff;
+	close_CMD[13]= (dblocptr->location.timeStamp) & 0xff;									
 	
 	sendCombinedArray(header,sizeof(header),close_CMD,sizeof(close_CMD),1);
 	//Echo_BT(20);
@@ -346,10 +338,10 @@ void open_lock(void)			//
 	open_CMD[9]= userid & 0xff;
 												
 	RTCtime();						
-	open_CMD[10]= (db.timeStamp[0]>>8) & 0xff;
-	open_CMD[11]= (db.timeStamp[0]) & 0xff;
-	open_CMD[12]= (db.timeStamp[1]>>8) & 0xff;
-	open_CMD[13]= (db.timeStamp[1]) & 0xff;		
+	open_CMD[10]= ((dblocptr->location.timeStamp)>>24) & 0xff;
+	open_CMD[11]= ((dblocptr->location.timeStamp)>>16) & 0xff;
+	open_CMD[12]= ((dblocptr->location.timeStamp)>>8) & 0xff;
+	open_CMD[13]= (dblocptr->location.timeStamp) & 0xff;				
 												
 	open_CMD[14] = btframe.Autoseal;//自动施封时间										
 													
@@ -407,34 +399,83 @@ void ReU5Proces(void)
 		{
 			SET_MENU_STATUS(7,1,0,3);
 		}
-		memset(autoRe,0,50);
+		memset(autoRe,0,1024);
 	}
 	else if(autoRe[1]==0x43 && autoRe[2]==0x4F && autoRe[3]==0x4E && autoRe[4]==0x4E && autoRe[5]==0x45 && autoRe[6]==0x43 && autoRe[7]==0x54 && autoRe[8]==0x45 && autoRe[9]==0x44 \
-		&& autoRe[10]==0x3A && autoRe[11]==0x30)//CONNECTED:0
+		&& autoRe[10]==0x3A)//CONNECTED:1 做从设备  0:做主设备
 	{
-		tipsflag = ConnOK;
-		refresh=true;
-		HAL_Delay(1000);
-		tipsflag = Working;
-		refresh=true;
-		HAL_Delay(1000);
-		if(preworkUp==3)
+		if(sys_mode[1]==DTU_MODE && autoRe[11]==0x31)
 		{
-			L1Working= true;
+			tipsflag = ConnOK;
+			menu.current = 0xBB;
+			btconn_dtu=true;
+			refresh=true;
 		}
-		else if(preworkUp==2)
+		else if(sys_mode[1]==PDA_MODE && autoRe[11]==0x30)
 		{
-			L2Working= true;
+			tipsflag = ConnOK;
+			refresh=true;
+			HAL_Delay(1000);
+			tipsflag = Working;
+			refresh=true;
+			HAL_Delay(1000);
+			if(preworkUp==3)
+			{
+				L1Working= true;
+			}
+			else if(preworkUp==2)
+			{
+				L2Working= true;
+			}
+			else if(preworkUp==1)
+			{
+				L3Working= true;
+			}
+			else if(preworkUp==0)
+			{
+				L4Working= true;
+			}
 		}
-		else if(preworkUp==1)
+
+		memset(autoRe,0,1024);
+	}
+	//*44 49 53 43 4f 4e 4e 3a 31 
+	else if(autoRe[1]==0x44 && autoRe[2]==0x49 && autoRe[3]==0x53 && autoRe[4]==0x43 && autoRe[5]==0x4f && autoRe[6]==0x4e && autoRe[7]==0x4e && autoRe[8]==0x3a)//disCONNECTED:1 做从设备  0:做主设备
+	{
+		if(sys_mode[1]==DTU_MODE && autoRe[9]==0x31)
 		{
-			L3Working= true;
+			tipsflag = Disconn;
+			menu.current = 0xBB;
+			
+			btconn_dtu=false;
+			refresh=true;
 		}
-		else if(preworkUp==0)
+		else if(sys_mode[1]==PDA_MODE && autoRe[9]==0x30)
 		{
-			L4Working= true;
+			tipsflag = ConnOK;
+			refresh=true;
+			HAL_Delay(1000);
+			tipsflag = Working;
+			refresh=true;
+			HAL_Delay(1000);
+			if(preworkUp==3)
+			{
+				L1Working= true;
+			}
+			else if(preworkUp==2)
+			{
+				L2Working= true;
+			}
+			else if(preworkUp==1)
+			{
+				L3Working= true;
+			}
+			else if(preworkUp==0)
+			{
+				L4Working= true;
+			}
 		}
-		memset(autoRe,0,50);
+		memset(autoRe,0,1024);
 	}
 	else if(autoRe[0]==0x45 && autoRe[1]==0x52 && autoRe[2]==0x52 && autoRe[3]==0x4f && autoRe[4]==0x52)//ERROR
 	{
@@ -442,7 +483,19 @@ void ReU5Proces(void)
 		HAL_Delay(1000);
 		//SET_MENU_STATUS(3,3,0,2);//回到操作界面
 		//USART_SendString(&huart5, "AT+DISCONN=0\r\n");//断开连接
-		memset(autoRe,0,50);
+		memset(autoRe,0,1024);
+	}
+	
+	
+	//*接收PDA信息
+	else if(autoRe[0]==0x66)
+	{
+		for (int i = 0; i < U5_BTrecvLength; i++)
+		{
+			PDA_pushArr[i] = (uint16_t)(autoRe[2*i] << 8) | autoRe[2*i+1];
+		}
+		
+		memset(autoRe,0,1024);
 	}
 	
 }	

+ 26 - 12
Core/Src/ml307a.c

@@ -13,6 +13,7 @@ RTC_TimeTypeDef GetTime;   //
 uint8_t step4g = 0;
 uint8_t resetcount_4g=0;
 uint8_t ICCID[30];
+
 //*布尔
 bool module4G_F = false;
 bool reset4Gmodule = false;
@@ -29,6 +30,8 @@ char hour_str[3];
 char minute_str[3];
 char second_str[3];
 
+
+
 //*本模块方法
 void ML307AReset(void);
 void RTCtime(void);
@@ -104,15 +107,15 @@ void ML307A_Init(void)
 				step4g++;
 				printf("#TCP连接成功\r\n");
 			}
-
 			//break;
 		}
 		
 		case 4:
 		{
-			if(sendCmd_4G("AT+MIPCFG=\"encoding\",1,1,1\r\n", "OK", 1, 1))//默认输入输出为ASCII,0    发16,1    接16,1
+			sendCmd_4G("AT+MIPCFG=\"encoding\",1,1,1\r\n", "OK", 1, 1);//默认输入输出为ASCII,0    发16,1    接16,1
+			
+			if(!reset4Gmodule)
 			{
-				
 				if(sendCmd_4G("AT+MGNSSCFG=\"nmea/mask\",0\r\n", "OK", 1, 1))
 				{
 					printf("#使能NMEA信息\r\n");
@@ -122,17 +125,19 @@ void ML307A_Init(void)
 						if(sendCmd_4G("AT+MGNSS=1\r\n", "OK", 1, 1))
 						{
 							printf("#开启MGNSS\r\n");
-							MgnssFlag = true;
 						}
 					}
 				}
-				printf("#TCP设置完成\r\n");
-				Time_inquiry(0);
-				module4G_F=true;
-				RTCtime();//写入做参考
-				break;
+			}
+			else
+			{
+				reset4Gmodule=false;
 			}
 
+			printf("#TCP设置完成\r\n");
+			Time_inquiry(0);
+			module4G_F=true;
+			RTCtime();//写入做参考
 			break;
 		}
 		
@@ -155,6 +160,8 @@ void ML307A_Init(void)
 		if(sendCmd_BT("AT+ADV=1\r\n","OK",1,1))//开启广播
 		{
 			printf("开启广播\r\n");
+			
+			USART_SendString(&huart5, "AT+DISCONN=1\r\n");
 			menu.current=0;
 		}
 		else if(!module4G_F)
@@ -173,6 +180,7 @@ void ML307A_Init(void)
 		sys_mode[1]=PDA_MODE;
 		if(sendCmd_BT("AT+ADV=0\r\n","OK",1,1))//关闭广播
 		{
+			USART_SendString(&huart5, "AT+DISCONN=0\r\n");
 			printf("关闭广播\r\n");
 			menu.current=0;
 		}
@@ -231,6 +239,7 @@ void ML307AReset(void)
 	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
 	HAL_Delay(5000);
 	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
+	HAL_Delay(5000);
 }
 
 void Pre_processing_4G(void)//传递消息前处理
@@ -238,7 +247,7 @@ void Pre_processing_4G(void)//
 	if(module4G_F)	//4G启动位
 	{
 		module4G_F=false;		//鉴权操作
-		tt808FsFunc(ICCID,22,XXID_zdjq);
+		tt808FsFunc(ICCID,22,MessageID_authentication);
 	} 
 }
 
@@ -265,7 +274,11 @@ void RTCtime(void)
 	 tt808.Rtime[4] = GetTime.Minutes;
 	 tt808.Rtime[5] = GetTime.Seconds;
 	
-	 time_bj();
+	
+	 hexArrayToBcd(tt808.Rtime,6,TimeBCD);
+	 printf("%02X%02X%02X%02X%02X%02X\r\n",tt808.Rtime[0],tt808.Rtime[1],tt808.Rtime[2],tt808.Rtime[3],tt808.Rtime[4],tt808.Rtime[5]);
+	 printf("%02X%02X%02X%02X%02X%02X\r\n",TimeBCD[0],TimeBCD[1],TimeBCD[2],TimeBCD[3],TimeBCD[4],TimeBCD[5]);
+	 time_bj();//转换时间戳
 	
 }
 void Time_inquiry(uint8_t flag)
@@ -289,13 +302,14 @@ void Time_inquiry(uint8_t flag)
 			minute_str[2] = '\0';
 			second_str[2] = '\0';
 			
+
 			ZHSJ(&tt808.Rtime[0],year_str);
 			ZHSJ(&tt808.Rtime[1],month_str);
 			ZHSJ(&tt808.Rtime[2],day_str);
 			ZHSJ(&tt808.Rtime[3],hour_str);
 			ZHSJ(&tt808.Rtime[4],minute_str);
 			ZHSJ(&tt808.Rtime[5],second_str);
-			tongbushijian(tt808.Rtime[0], tt808.Rtime[1], tt808.Rtime[2], tt808.Rtime[3], tt808.Rtime[4], tt808.Rtime[5]);
+			SyncTime(tt808.Rtime[0], tt808.Rtime[1], tt808.Rtime[2], tt808.Rtime[3], tt808.Rtime[4], tt808.Rtime[5]);
 		}
 	}
 	else

+ 1 - 1
Core/Src/rtc.c

@@ -125,7 +125,7 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
 }
 
 /* USER CODE BEGIN 1 */
-void tongbushijian(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minutes, uint8_t seconds)
+void SyncTime(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minutes, uint8_t seconds)
 {
   sTime.Hours = hour;
   sTime.Minutes = minutes;

+ 1 - 3
Core/Src/stm32f1xx_it.c

@@ -479,7 +479,6 @@ void UART5_IRQHandler(void)
 	if (index > 0 && __HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE) == SET)
 	{
 		index = 0; // 将记录位置的变量重新置为0
-		memset(U5_BTrecvBuff,0,BUFFER_SIZE);
 	}
 			
     if (__HAL_UART_GET_FLAG(&huart5, UART_FLAG_RXNE) == SET) // 检查是否接收到数据
@@ -490,10 +489,9 @@ void UART5_IRQHandler(void)
         {
             index++; // 将记录位置的变量加1
         }
-		U5_BTrecvLength = index;
 		memset(U5_BTrecvBuff,0,index);
+		U5_BTrecvLength = index;
 		
-		// 将剩余数据转移到g_MBA32A_8buf_Down中去处理
 		for (int i = 0; i < index; i++)
 		{
 			U5_BTrecvBuff[i] = U5_BTrecvBuff1[i];

+ 180 - 130
Core/Src/tt808.c

@@ -5,13 +5,11 @@
 #include <time.h>
 #include <stdlib.h>
 #include <string.h>
+#include "rtc.h"
 //*整型
 int rlt;
-uint8_t xxtnewlength=0;
 uint16_t uploadtime=0;	//上传时间
 uint16_t hccd = 0;//ascii个数(*2)
-uint8_t xxtfzData[100];	//放入封装后数据
-uint8_t tcppacket[100]; //消息数据
 uint8_t header[12];		//处理头部
 uint8_t index_2c = 0;
 uint8_t MIPurc[100];	//接收平台数据
@@ -21,12 +19,14 @@ uint8_t speedBegin=0;
 uint8_t speedEnd=0;
 uint8_t speed[10];		//处理头部
 double dSpeed=0;
-double dWd=0;
-double dJd=0;
+double dlatitude=0;
+double dlongitude=0;
 char cSpeed[10];
-char wd[15];
-char jd[15];
+char clatitude[15];
+char clongitude[15];
+char csatellitesNum[5];
 char MGNSSLOC[100];	//接收定位数据
+char CSQ[12];	//接收定位数据
 
 char MGNSSLOC_time[6];	//接收定位数据
 uint32_t Stamp =0;
@@ -36,21 +36,25 @@ TT808 tt808;
 extern TipsFlag tipsflag;	
 extern Menu_table menu;	
 extern bool refresh;
-extern Database db;
 //*布尔
 bool ZDJQflag = false;
 bool GnssFlag = false;
 
-void chuli(uint16_t XXID)
+
+
+uint8_t Messagetemp_length=0;
+uint8_t MessageHandleData[100];	//放入封装后数据
+uint8_t tcppacket[100]; //消息数据
+void MessageHandle(uint16_t MessageID)
 {
 
-	uint16_t XXTSXdata = xxtnewlength;
-	XXTSXdata |= ( xxtnewlength | (TCPJMFSNULL<<10)); // 将长度左移3位后和加密方式进行按位或操作(001 RSA ,000 无加密)
+	uint16_t MessageAttributeData = Messagetemp_length;
+	MessageAttributeData |= ( Messagetemp_length | (TCPJMFSNULL<<10)); // 将长度左移3位后和加密方式进行按位或操作(001 RSA ,000 无加密)
 	
-	header[0] 	= ((XXID>>8)&0xff);
-	header[1] 	= (XXID&0xff);				//消息ID
-	header[2] 	= ((XXTSXdata>>8)&0xff);
-	header[3] 	= (XXTSXdata&0xff);			//消息属性
+	header[0] 	= ((MessageID>>8)&0xff);
+	header[1] 	= (MessageID&0xff);				//消息ID
+	header[2] 	= ((MessageAttributeData>>8)&0xff);
+	header[3] 	= (MessageAttributeData&0xff);			//消息属性
 	header[4] 	= 0x00;
 	header[5] 	= 0x00;
 	header[6] 	= 0x16;
@@ -69,10 +73,10 @@ void chuli(uint16_t XXID)
 		tcppacket[index++] = header[i];
 	}
 	// Copy message body to packet
-	for (size_t i = 0; i < xxtnewlength; i++) {
-		tcppacket[index++] = xxtfzData[i];
+	for (size_t i = 0; i < Messagetemp_length; i++) {
+		tcppacket[index++] = MessageHandleData[i];
 	}
-	tcppacket[index++] = xorBytes(&tcppacket[1],12+xxtnewlength);;  // Set the checksum
+	tcppacket[index++] = xorBytes(&tcppacket[1],12+Messagetemp_length);;  // Set the checksum
 	tcppacket[index++] = TT808FLAG;      // Set the flag at the end
 	
 	
@@ -99,89 +103,93 @@ void chuli(uint16_t XXID)
 
 /**
   * @breaf 消息体封装
-  * xxt[] 消息数据;	xxtlength 消息数据长度;	outXxt[] 封装后消息数据; XXID 消息ID
+  * Message[] 消息数据;	length 消息数据长度;	outMessage[] 封装后消息数据; MessageID 消息ID
   */
-uint8_t xxtFZ(uint8_t xxt[], uint8_t xxtlength, uint8_t outXxt[],uint16_t XXID)
+uint8_t Message_bodydata(uint8_t *Message, uint8_t length, uint8_t outMessage[],uint16_t MessageID)
 {
 	int index = 0;
-	uint8_t newlength = 0;//加首尾 25/23/crc
+	uint8_t temp_length = 0;//加首尾 25/23/crc
 	
-	if(XXID==XXID_zdjq || XXID==XXID_zdxt)//不加头尾(鉴权、心跳)
+	if(MessageID==MessageID_authentication  || MessageID==MessageID_heartbeat)//不加头尾(鉴权、心跳)
 	{
-		newlength = xxtlength;//不加首尾
-		uint8_t newXxt[newlength];
+		temp_length = length;//不加首尾
+		uint8_t temp_Message[temp_length];
 		
-		for (int i = 0; i < xxtlength; i++) {
-			newXxt[index++] = xxt[i];  // 将消息头拷贝到报文中
+		for (int i = 0; i < length; i++) {
+			temp_Message[index++] = Message[i];  // 将消息头拷贝到报文中
 		}
 		
-		newlength = index;
+		temp_length = index;
 		
-		for(int i =0;i<newlength;i++)
+		for(int i =0;i<temp_length;i++)
 		{
-			outXxt[i]=newXxt[i];
+			outMessage[i]=temp_Message[i];
 		}
 	}
-	else if(XXID==XXID_zddz)				//终端地址
+	else if(MessageID==MessageID_location)//终端地址0200 有附加信息
 	{
 		
-		newlength = xxtlength;//不加首尾
-		uint8_t newXxt[newlength];
+		temp_length = length+6;//不加首尾
+		uint8_t temp_Message[temp_length];
 		
-		for (int i = 0; i < xxtlength; i++) {
-			newXxt[index++] = xxt[i];  // 将消息头拷贝到报文中
+		for (int i = 0; i < length; i++) {
+			temp_Message[index++] = Message[i];  // 将消息头拷贝到报文中
 		}
 		//*begin
-		newXxt[index++] = 0xEB;
-		//待添加
-		
-		//*end
-		newlength = index;
+		temp_Message[index++] = 0x30;//信号强度关键字
+		temp_Message[index++] = 0x01;//信号强度数据长度
+		temp_Message[index++] = dblocptr->location.CSQ;//信号强度值
+		temp_Message[index++] = 0x31;//信号强度关键字
+		temp_Message[index++] = 0x01;//信号强度数据长度
+		temp_Message[index++] = dblocptr->location.satellitesNum;//卫星数量
 		
-		for(int i =0;i<newlength;i++)
+		for(int i =0;i<temp_length;i++)
 		{
-			outXxt[i]=newXxt[i];
+			outMessage[i]=temp_Message[i];
 		}
 	}
 	else//加首尾
 	{
-		newlength = xxtlength+3;//加首尾 25/23/crc
-		uint8_t newXxt[newlength];
+		temp_length = length+3;//加首尾 25/23/crc
+		uint8_t temp_Message[temp_length];
 		
-		newXxt[index++]=newlength;
-		newXxt[index++]=0x2A;
-		for (int i = 0; i < xxtlength; i++) {
-			newXxt[index++] = xxt[i];  // 将消息头拷贝到报文中
+		temp_Message[index++]=temp_length;
+		temp_Message[index++]=0x2A;
+		for (int i = 0; i < length; i++) {
+			temp_Message[index++] = Message[i];  // 将消息头拷贝到报文中
 		}
-		newXxt[index++]=0x23;
-		newXxt[index++]=xorBytes(&newXxt[1],newlength-1);
-		newlength = index;
+		temp_Message[index++]=0x23;
+		temp_Message[index++]=xorBytes(&temp_Message[1],temp_length-1);
+		temp_length = index;
 		
-		for(int i =0;i<newlength;i++)
+		for(int i =0;i<temp_length;i++)
 		{
-			outXxt[i]=newXxt[i];
+			outMessage[i]=temp_Message[i];
 		}
 	}
 	
 	//test
-//	for (int i = 0; i < newlength; i++) {
-//		printf("%02X ", newXxt[i]);  // 以十六进制格式打印每个元素
+//	for (int i = 0; i < temp_length; i++) {
+//		printf("%02X ", temp_Message[i]);  // 以十六进制格式打印每个元素
 //	}
-	return  newlength;
+	return  temp_length;
 }
 
-/*需要传入消息体长度sizeof(xxt)/sizeof(xxt[0]);*/
-void tt808FsFunc(uint8_t xxt[], uint8_t xxtlength, uint16_t XXID)
+/*需要传入消息体长度sizeof(Message)/sizeof(Message[0]);*/
+void tt808FsFunc(uint8_t* Message, uint8_t length, uint16_t MessageID)
 {
 	HAL_Delay(200);
-	xxtnewlength = xxtFZ(xxt, xxtlength, xxtfzData, XXID);
-	chuli(XXID);
+	Messagetemp_length = Message_bodydata(Message, length, MessageHandleData, MessageID);
+	MessageHandle(MessageID);
 	
 }
 
-
-
-
+void printBytes(uint8_t *data, size_t length) {
+    for (size_t i = 0; i < length; i++) {
+        printf("%02x ", data[i]);
+    }
+    printf("\n");
+}
 // 函数用于提取第7到第8个逗号之间的字符串
 void extractString(char* receiveStr, char* result, uint8_t start, uint16_t end)
 {
@@ -228,9 +236,18 @@ void extractString(char* receiveStr, char* result, uint8_t start, uint16_t end)
 }
 
 double convertToDouble(char* str) {
-  double result;
-  sscanf(str, "%lf", &result);
-  return result;
+	if(str == csatellitesNum)
+	{
+	  uint8_t result;
+	  sscanf(str, "%hhu", &result);
+	  return result;
+	}
+	else
+	{
+	  double result;
+	  sscanf(str, "%lf", &result);
+	  return result;
+	}
 }
 
 char hex2asc(const char *hex)
@@ -243,6 +260,11 @@ char hex2asc(const char *hex)
 	}
 	return asc;
 }
+uint8_t testHex2Asc(const char *hex) {
+    char asc = hex2asc(hex);
+    printf("Hex: %s\tASC: %d\n", hex, asc);
+	return asc;
+}
 
 char *bin2hex(char *hex, const unsigned char *bin, int size)
 {
@@ -268,11 +290,24 @@ int hex2bin(unsigned char *bin, const char *hex)
 	return rlt;//长度
 }
 
+// 将单个十六进制数转换为 BCD 码
+uint8_t hexToBcd(uint8_t hex) {
+    return ((hex / 10) << 4) | (hex % 10);
+}
+// 将整数数组中的所有十六进制数转换为 BCD 码
+void hexArrayToBcd(uint8_t* array, size_t length, uint8_t* out) {
+	array[3]+=8;
+    for (size_t i = 0; i < length; i++) {
+        out[i] = hexToBcd(array[i]);
+    }
+}
+
+//MgnssFlag = true;
 void ReMIPURC(void)
 {
 	 //4D 49 50 55 52 43
 	 if(U4_4GrecvBuff[1]==0x4D && U4_4GrecvBuff[2]==0x49 && U4_4GrecvBuff[3]==0x50 \
-		  && U4_4GrecvBuff[4]==0x55 && U4_4GrecvBuff[5]==0x52 && U4_4GrecvBuff[6]==0x43 )	//监测平台回复+MIPURC: 
+		  && U4_4GrecvBuff[4]==0x55 && U4_4GrecvBuff[5]==0x52 && U4_4GrecvBuff[6]==0x43 && U4_4GrecvBuff[10] != 0x64)	//监测平台回复+MIPURC: 
 	 { 
 		uint8_t high_byte = (U4_4GrecvBuff[18]&0x0f) *10; 
 		uint8_t low_byte = U4_4GrecvBuff[19]&0x0f; 
@@ -289,7 +324,15 @@ void ReMIPURC(void)
 		memset(MIPurc1,0,100);
 		 
 	 }
-	 
+	//64 69 73 63 6f 6e 6e 22 2c 31 2c 31 "disconn"
+	 else if(U4_4GrecvBuff[10]== 0x64 && U4_4GrecvBuff[11]== 0x69 && U4_4GrecvBuff[12]== 0x73 && U4_4GrecvBuff[13]== 0x63 && U4_4GrecvBuff[14]== 0x6f \
+		 && U4_4GrecvBuff[15]== 0x6e && U4_4GrecvBuff[16]== 0x6e && U4_4GrecvBuff[17]== 0x22 \
+		 && U4_4GrecvBuff[18]== 0x2c && U4_4GrecvBuff[19]== 0x31 && U4_4GrecvBuff[20]== 0x2c && U4_4GrecvBuff[21]== 0x31)
+	 {
+		 ML307AReset();
+		 memset(U4_4GrecvBuff,0,BUFFER_SIZE);
+	 }
+
 				//时间     纬度(北纬)   经度(东经)  水平精度因子  海拔高度    定位类型(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[2]==0x47 || (U4_4GrecvBuff[0]==0x4F && U4_4GrecvBuff[1]==0x4B)) && MgnssFlag)	//监测平台回复+MGNSSLOC OK4f4b
@@ -303,8 +346,8 @@ void ReMIPURC(void)
 	 }
 	 
 
-	else if(U5_BTrecvBuff[0]==0x66 && U5_BTrecvBuff[1]==0x00 && U5_BTrecvBuff[2]==0x02 && U5_BTrecvBuff[3]==0x01)//解封接收
-	{
+	 else if(U5_BTrecvBuff[0]==0x66 && U5_BTrecvBuff[1]==0x00 && U5_BTrecvBuff[2]==0x02 && U5_BTrecvBuff[3]==0x01)//解封接收
+	 {
 		if(U5_BTrecvBuff[4]==0x01)
 		{//接收完成
 			tipsflag = FinshOK;
@@ -333,9 +376,9 @@ void ReMIPURC(void)
 		}
 		
 	}
-	else if(U5_BTrecvBuff[0]==0x66 && U5_BTrecvBuff[1]==0x00 && U5_BTrecvBuff[2]==0x03 && U5_BTrecvBuff[3]==0x01)//解封接收
-	{
-		if(U5_BTrecvBuff[4]==0x01)
+	 else if(U5_BTrecvBuff[0]==0x66 && U5_BTrecvBuff[1]==0x00 && U5_BTrecvBuff[2]==0x03 && U5_BTrecvBuff[3]==0x01)//解封接收
+	 {
+	 	if(U5_BTrecvBuff[4]==0x01)
 		{//接收完成
 			tipsflag = FinshOK;
 			HAL_Delay(1000);
@@ -365,11 +408,25 @@ void ReMIPURC(void)
 	}
 	
 	
-	else if(U5_BTrecvBuff[0]==0x2B && U5_BTrecvBuff[1]==0x43 && U5_BTrecvBuff[2]==0x50 && U5_BTrecvBuff[3]==0x49 && U5_BTrecvBuff[4]==0x4E && \
+	 else if(U5_BTrecvBuff[0]==0x2B && U5_BTrecvBuff[1]==0x43 && U5_BTrecvBuff[2]==0x50 && U5_BTrecvBuff[3]==0x49 && U5_BTrecvBuff[4]==0x4E && \
 		U5_BTrecvBuff[5]==0x3A && U5_BTrecvBuff[6]==0x20 && U5_BTrecvBuff[7]==0x53 && U5_BTrecvBuff[8]==0x49 && U5_BTrecvBuff[9]==0x4D && U5_BTrecvBuff[10]==0x20 && U5_BTrecvBuff[11]==0x52)//+CPIN: SIM R
-	{
+	 {
 		reset4Gmodule = true;
-	}
+	 }
+	 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]== 0x55 && U4_4GrecvBuff[7]== 0x52 && U4_4GrecvBuff[8]== 0x43 \
+		 && U4_4GrecvBuff[9]== 0x3A && U4_4GrecvBuff[10]== 0x20 && U4_4GrecvBuff[11]== 0x22 && U4_4GrecvBuff[12]== 0x73 \
+		 && U4_4GrecvBuff[19]== 0x31 )
+	 {
+		 MgnssFlag = true;
+	 }
+	 else if(U4_4GrecvBuff[1]== 0x43 && U4_4GrecvBuff[2]== 0x53 && U4_4GrecvBuff[3]== 0x51)//CSQ 信号
+	 {
+		memcpy(CSQ,U4_4GrecvBuff,U4_4GrecvLength);
+		tt808.CSQ = (CSQ[6]&0xf*10)+(CSQ[7]&0xf);
+		memset(CSQ,0,12);
+		memset(U4_4GrecvBuff,0,BUFFER_SIZE);
+	 }
 
  }
 
@@ -385,7 +442,7 @@ void MIPURCHandle(void)
 		 if(PTXXID==XXID_pttyyd)			//收到平台通用应答0x8001
 		 {
 			 			 
-			if(xxRE == XXID_zdjq)//回复鉴权ID
+			if(xxRE == MessageID_authentication)//回复鉴权ID
 			{
 				if(YESorNO==YES)
 				{
@@ -398,7 +455,7 @@ void MIPURCHandle(void)
 				}
 				memset(MIPurc,0,rlt);//rlt下发长度 
 			}
-			if(xxRE == XXID_zdxt)//回复鉴权ID
+			if(xxRE == MessageID_heartbeat)//回复鉴权ID
 			{
 				if(YESorNO==YES)
 				{
@@ -418,6 +475,8 @@ void MIPURCHandle(void)
 			 uint8_t tcsjLen = MIPurc[13];
 			 memcpy(MIPurcXXTCSJ,&MIPurc[13],xxtcLen);
 			 printf("@得到透传数据,%d\r\n",tcsjLen);
+			 
+
 			 memset(MIPurc,0,rlt);//rlt下发长度 
 			 
 		 }
@@ -429,38 +488,30 @@ void MIPURCHandle(void)
 	 {
 		 ZDJQflag = false;
 		 HAL_Delay(500);
-	 	 uint8_t test[] = {0xAA};			//test心跳
-		 tt808FsFunc(test,1,XXID_zdxt);		//test心跳
+	 	 uint8_t test[] = {0x05};			//test心跳
+		 tt808FsFunc(test,1,MessageID_heartbeat);		//test心跳
 		 uploadtime = HAL_GetTick();//获取首次发送状态信息基准时间
 	 }
-	 
-
-	 
 }
 
 
 time_t timestamp ;
-void time_bj(void) {
-	
-		struct tm timeinfo;
-		timeinfo.tm_year = tt808.Rtime[0]+2000-1900;
-		timeinfo.tm_mon = tt808.Rtime[1]-1;
-		timeinfo.tm_mday = tt808.Rtime[2];
-		timeinfo.tm_hour = tt808.Rtime[3];
-		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 time_bj(void) 
+{
+	struct tm timeinfo;
+	timeinfo.tm_year = tt808.Rtime[0]+2000-1900;
+	timeinfo.tm_mon = tt808.Rtime[1]-1;
+	timeinfo.tm_mday = tt808.Rtime[2];
+	timeinfo.tm_hour = tt808.Rtime[3]-8;
+	timeinfo.tm_min = tt808.Rtime[4];
+	timeinfo.tm_sec = tt808.Rtime[5];
+	timestamp = mktime(&timeinfo);
+		
+	dblocptr->location.timeStamp = timestamp;
 }
 
 
 
-
-
-
-
 void ReU4Proces(void)
 {
 	if(GnssFlag)
@@ -471,37 +522,37 @@ void ReU4Proces(void)
 		// 调用函数提取字符串
 		extractString(MGNSSLOC, cSpeed,7 ,8);//采集
 		dSpeed = convertToDouble(cSpeed);	//转换浮点数
-		dSpeed*=100;
-
+		dSpeed*=10;
 
-		// 调用函数提取字符串
-		extractString(MGNSSLOC, wd,1 ,2);//采集
-		dWd = convertToDouble(wd);	//转换浮点数
-		dWd*=10000;
 
 		// 调用函数提取字符串
-		extractString(MGNSSLOC, jd,2 ,3);//采集
-		dJd = convertToDouble(jd);	//转换浮点数
-		dJd*=10000;
+		extractString(MGNSSLOC, clatitude,1 ,2);//采集
+		dlatitude = convertToDouble(clatitude);	//转换浮点数
+		dblocptr->location.latitude = convertGPS(dlatitude);
+		
+		extractString(MGNSSLOC, clongitude,2 ,3);//采集
+		dlongitude = convertToDouble(clongitude);	//转换浮点数
+		dblocptr->location.longitude = convertGPS(dlongitude);
+		
+		
+		extractString(MGNSSLOC, csatellitesNum,10 ,11);//采集卫星个数
+		tt808.satellitesNum = convertToDouble(csatellitesNum);	//转换浮点数
+		//printf("%d",tt808.satellitesNum);
 		
-		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("提取到的字符串为:%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)
+		dblocptr->location.speed  = (uint16_t)dSpeed;
+		
+		
+		if(dSpeed !=0 && dlongitude!=0 && dlatitude!=0) //有数据进行更新!
+		{
+			signal = true;			
+			
+			if(menu.current == 0xBB && tipsflag!= ConnOK)
+			{
+				menu.current = 0;
+				refresh=true;
+			}
+			else if(tipsflag == Back && signal)
 			{
 				menu.current = 0;
 				refresh=true;
@@ -509,18 +560,17 @@ void ReU4Proces(void)
 		}
  		else
 		{
-			if(signal)
+			if(signal && sys_mode[0]!=0xFFFF)
 			{ 
-				//signal = false;
+				signal = false;
 				menu.current = 0xBB;
 				tipsflag = Nosignal;
 				refresh=true;
 			}
 
 		}
-
-		//printf("Time: %04X%04X\n", db.timeStamp[0],db.timeStamp[1]);		
-
+		
+		
 		memset(MGNSSLOC,0,100);
 
 	}

+ 35 - 3
Core/Src/usart.c

@@ -699,12 +699,12 @@ void Flash_ReadBytes(uint16_t* sorBuf,uint32_t FlashAddr,uint16_t len)
 }
 
 
+HAL_StatusTypeDef WriteSta;
 // 定义Flash缓冲区
 uint16_t Flashbuf[2048] __attribute__((at(0X20001000)));
 // Flash写入函数
 HAL_StatusTypeDef Flash_WriteBytes(uint16_t* sorBuf, uint32_t FlashAddr, uint16_t len)
 {
-	HAL_StatusTypeDef WriteSta;
     uint32_t Offset_ADDR = 0, Page_StartAddr = 0, i = 0;
     // 计算偏移地址和起始地址
     Offset_ADDR = FlashAddr % FLASH_PAGE_SIZE;
@@ -738,6 +738,8 @@ HAL_StatusTypeDef Flash_WriteBytes(uint16_t* sorBuf, uint32_t FlashAddr, uint16_
     return WriteSta;
 }
 
+
+
 void Printf_u4u5logbyU1(void)
 {
 	if(U4_4GreFlag)
@@ -750,6 +752,7 @@ void Printf_u4u5logbyU1(void)
 		U5_BTreFlag=false;
 		memcpy(autoRe,U5_BTrecvBuff,U5_BTrecvLength);
 		HAL_UART_Transmit(&huart1,U5_BTrecvBuff,U5_BTrecvLength,0xFFFF);
+		//memset(U5_BTrecvBuff,0,BUFFER_SIZE);
 	}  
 }
 
@@ -763,6 +766,7 @@ uint8_t xorBytes(uint8_t arr[], int size) {
     //printf("异或结果: %02X\n", result); // 打印异或结果
 	return result;
 }
+
 uint16_t crc16(uint8_t *data, size_t len) {
     uint8_t flag;
     uint16_t wcrc = 0xffff;
@@ -787,7 +791,7 @@ void USART_SendHexArray(UART_HandleTypeDef *huart, uint8_t *data, int length)
 }
 
 struct AES_ctx ctx;
-void sendCombinedArray(uint8_t *header, size_t headerLength, uint8_t *command, size_t commandLength, bool JM) {
+void sendCombinedArray(uint8_t *header, size_t headerLength, uint8_t *command, size_t commandLength, bool encryption) {
 	
     // 创建一个长度为20的数组
     uint8_t combinedArray[20] = {0};
@@ -806,7 +810,7 @@ void sendCombinedArray(uint8_t *header, size_t headerLength, uint8_t *command, s
     cmd_array[commandLength] = result_xor;
 
 /* 加密 */		
-	if(JM)
+	if(encryption)
 	{
 		AES_init_ctx_iv(&ctx, DtuBtKey, iv);
 		AES_CBC_encrypt_buffer(&ctx, cmd_array, 16);
@@ -825,4 +829,32 @@ void sendCombinedArray(uint8_t *header, size_t headerLength, uint8_t *command, s
     // 发送combinedArray
     USART_SendHexArray(&huart5, combinedArray, sizeof(combinedArray));
 }
+
+
+uint32_t convertGPS(double temp) {
+//*WGS-84坐标
+	if(temp > 40)
+	{
+		temp = temp/100;
+		double latDeg = floor(temp);//向下取整 纬度
+		double latMin = fmod(temp, 1);
+		temp = latDeg + (latMin / 60.0)*100;
+		
+		double dlat = temp;
+		uint32_t latMicrodegree = (uint32_t)(dlat * 1000000);
+		return latMicrodegree;
+	}
+	else
+	{
+		temp = temp/100;
+		double lonDeg = floor(temp);//向下取整
+		double lonMin = fmod(temp, 1);
+		temp = lonDeg + (lonMin / 60.0)*100;
+		
+		double dlng = temp;
+		uint32_t lngMicrodegree = (uint32_t)(dlng * 1000000);
+		return lngMicrodegree;
+	}
+	
+}
 /* USER CODE END 1 */

+ 25 - 5
MDK-ARM/dtu.uvoptx

@@ -153,19 +153,39 @@
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>db</ItemText>
+          <ItemText>dblocptr</ItemText>
         </Ww>
         <Ww>
           <count>1</count>
           <WinNumber>1</WinNumber>
-          <ItemText>temp_jc</ItemText>
+          <ItemText>dbeveptr</ItemText>
+        </Ww>
+        <Ww>
+          <count>2</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>CSQ</ItemText>
+        </Ww>
+        <Ww>
+          <count>3</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>tt808</ItemText>
+        </Ww>
+        <Ww>
+          <count>4</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>year_str</ItemText>
+        </Ww>
+        <Ww>
+          <count>5</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>MIPurcXXTCSJ</ItemText>
         </Ww>
       </WatchWindow1>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>
           <SubType>0</SubType>
-          <ItemText>EveDbHeadStart</ItemText>
+          <ItemText>LocDbHeadStart</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>
@@ -173,7 +193,7 @@
         <Mm>
           <WinNumber>2</WinNumber>
           <SubType>0</SubType>
-          <ItemText>EveDbBodyStart</ItemText>
+          <ItemText>LocDbBodyStart</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow2>
@@ -355,7 +375,7 @@
       <GroupNumber>2</GroupNumber>
       <FileNumber>10</FileNumber>
       <FileType>1</FileType>
-      <tvExp>1</tvExp>
+      <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>../Core/Src/main.c</PathWithFileName>