|
@@ -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);
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|