⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 do_gps.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 2 页
字号:
					gDisp_Buffer[gDisp_Buffer_Point]=14;
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]=0;
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]='@';
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]='%';
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]=12;
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_STATUS_DOWN;
					gDisp_Buffer_Point++;
					if(gGeneral_Flag&GPS_VALID_F_1)
					{
						gDisp_Buffer[gDisp_Buffer_Point]=CYear;
						gDisp_Buffer_Point++;
						gDisp_Buffer[gDisp_Buffer_Point]=CMonth;
						gDisp_Buffer_Point++;
						gDisp_Buffer[gDisp_Buffer_Point]=CDate;
					}
					else
					{
						gDisp_Buffer[gDisp_Buffer_Point]=0x05;
						gDisp_Buffer_Point++;
						gDisp_Buffer[gDisp_Buffer_Point]=0x01;
						gDisp_Buffer_Point++;
						gDisp_Buffer[gDisp_Buffer_Point]=0x01;
					}
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]=CHour;
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]=CMinute;
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]=CSecond;
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]='$';
					gDisp_Buffer_Point++;
					gDisp_Buffer[gDisp_Buffer_Point]='&';
					gDisp_Buffer_Point++;
				}
			}
			/********************************************************\
			3,如果GPS数据有效,则进行的有关处理
			\********************************************************/
		    if(gGeneral_Flag&GPS_VALID_F_1)
		    {
				/*
		    	//显示当前GPS的经,纬度值
				Send_COM1_Byte('O');Send_COM1_Byte('[');
				Send_COM1_Byte(ASCII((gLongitude/0x1000000)/0x10));
				Send_COM1_Byte(ASCII((gLongitude/0x1000000)%0x10));
				Send_COM1_Byte(ASCII((gLongitude%0x1000000/0x10000)/0x10));
				Send_COM1_Byte(ASCII((gLongitude%0x1000000/0x10000)%0x10));
				Send_COM1_Byte(ASCII((gLongitude%0x10000/0x100)/0x10));
				Send_COM1_Byte(ASCII((gLongitude%0x10000/0x100)%0x10));
				Send_COM1_Byte(ASCII((gLongitude%0x100)/0x10));
				Send_COM1_Byte(ASCII((gLongitude%0x100)%0x10));
				Send_COM1_Byte(']');
				Send_COM1_Byte('A');Send_COM1_Byte('[');
				Send_COM1_Byte(ASCII((gLatitude/0x1000000)/0x10));
				Send_COM1_Byte(ASCII((gLatitude/0x1000000)%0x10));
				Send_COM1_Byte(ASCII((gLatitude%0x1000000/0x10000)/0x10));
				Send_COM1_Byte(ASCII((gLatitude%0x1000000/0x10000)%0x10));
				Send_COM1_Byte(ASCII((gLatitude%0x10000/0x100)/0x10));
				Send_COM1_Byte(ASCII((gLatitude%0x10000/0x100)%0x10));
				Send_COM1_Byte(ASCII((gLatitude%0x100)/0x10));
				Send_COM1_Byte(ASCII((gLatitude%0x100)%0x10));
				Send_COM1_Byte(']');
				Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
				*/
				/////////////////////////////////////////
                gYear=CYear;
                gMonth=CMonth;
                gDate=CDate;
                gHour=CHour;
                gMinute = CMinute;
                gSecond=CSecond;
                gGPS_Invaild_Timer=0;
				gGps_Null_Count=0;
				gPublic_Flag &=~ GPS_NULL_F_1;
				//判断是否满足条件,进行记录仪的时间矫正设置的命令
				if(   (gPublic_Flag&SET_RECORD_TIME_F_1)
					&&(gSecond==0)
					&&(gStatus==NORMAL_TYPE)
					&&((gPublic_Flag&CHECK_TIME_F_1)==0)  )
				{
					Send_COM1_String( (unsigned char *)CHECK_TIME,sizeof(CHECK_TIME) );
			    	Send_COM1_Byte(gStatus);
			    	Check_Record = gStatus;
			    	Send_COM1_Byte(0xAA);
			    	Check_Record ^= 0xAA;
			    	Send_COM1_Byte(0x75);
			    	Check_Record ^= 0x75;
			    	Send_COM1_Byte(G_SET_TIME);		//命令字
			    	Check_Record ^= G_SET_TIME;
			    	Send_COM1_Byte(0);
			    	Check_Record ^= 0;
			    	Send_COM1_Byte(6);		//长度6
			    	Check_Record ^= 6;
			    	Send_COM1_Byte(0x00);
			    	Check_Record ^= 0x00;	//保留字节
			    	Send_COM1_Byte(gYear);
			    	Check_Record ^= gYear;
			    	Send_COM1_Byte(gMonth);
			    	Check_Record ^= gMonth;
			    	Send_COM1_Byte(gDate);
			    	Check_Record ^= gDate;
			    	Send_COM1_Byte(gHour);
			    	Check_Record ^= gHour;
			    	Send_COM1_Byte(gMinute);
			    	Check_Record ^= gMinute;
			    	Send_COM1_Byte(gSecond);
			    	Check_Record ^= gSecond;
			    	Send_COM1_Byte(Check_Record);					//校验核
			    	Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);		//包尾

				}
				/*
                //D:存储一分钟一个点的历史轨迹
                if( (CMinute!=CMinute_Temp)&&(gCycle_Send_Status!=PASS_DATA) )
                {
                	gPassTrack_Store_Item++;
                	//将指向下一个历史点的存储位置,如果判断已经到了页尾,则需要从新开始下一个页的存储
                    if( ( gPassTrack_Store_Item>=16 )||( gPassTrack_Store_Item<=0 ) )
                    {
                    	gPassTrack_Store_Item=1;
                    	//1,判断是否到了规定存储历史轨迹区域的最后一个扇区
						if((gPassTrack_Store_Sector>=FLASH_PASTDATA_E_2)||(gPassTrack_Store_Sector<FLASH_PASTDATA_S_2) )
						{
							gPassTrack_Store_Sector=FLASH_PASTDATA_S_2;
						}
						else 	gPassTrack_Store_Sector++;
						//2,将下一个扇区的内容写成记忆页
						OperateSPIEnd();
						WriteOneByteToBuffer2(0xFF,0xaa);
						OperateSPIEnd();
						WriteBuffer2ToPage(gPassTrack_Store_Sector+1);
						gTimer=0;Clear_Exter_WatchDog();
						while(gTimer<500){}
						Clear_Exter_WatchDog();
						OperateSPIEnd();
                    }
					OperateSPIEnd();
					//读对应gPassTrack_Store_Sector扇区中的数据到buffer2.
					ReadOnePageToBuffer2(gPassTrack_Store_Sector);
					//计算在这个扇区需要存到的下一个位置
					i=(gPassTrack_Store_Item-1)*17;
					OperateSPIEnd();
					//long int gLatitude  gLongitude 四个字节
					WriteOneByteToBuffer2( (i+0),gLongitude/0x1000000);
					WriteNextByteToBuffer2( gLongitude%0x1000000/0x10000 );
					WriteNextByteToBuffer2( gLongitude%0x10000/0x100 );
					WriteNextByteToBuffer2( gLongitude%0x100 );

					WriteNextByteToBuffer2( gLatitude/0x1000000 );
					WriteNextByteToBuffer2( gLatitude%0x1000000/0x10000 );
					WriteNextByteToBuffer2( gLatitude%0x10000/0x100 );
					WriteNextByteToBuffer2( gLatitude%0x100 );

					WriteNextByteToBuffer2( gSpeed );
					WriteNextByteToBuffer2( gAzimuth );
					WriteNextByteToBuffer2( nFlag|FLAG_GPSVAILD_1 );
					WriteNextByteToBuffer2( gYear );
					WriteNextByteToBuffer2( gMonth );
					WriteNextByteToBuffer2( gDate );
					WriteNextByteToBuffer2( gHour );
					WriteNextByteToBuffer2( gMinute );
					WriteNextByteToBuffer2( gSecond );
					OperateSPIEnd();
					//写已经存储的条数
					WriteOneByteToBuffer2( 0xFF,gPassTrack_Store_Item );

					//后面存储的是里程统计数据
					WriteNextByteToBuffer2( gALL_Distance/0x1000000 );
					WriteNextByteToBuffer2( gALL_Distance%0x1000000/0x10000 );
					WriteNextByteToBuffer2( gALL_Distance%0x10000/0x100 );
					WriteNextByteToBuffer2( gALL_Distance%0x100 );
					OperateSPIEnd();
					//将buffer2中的数据写入相应的Flash的区域中
					if( (gPassTrack_Store_Sector>=FLASH_PASTDATA_S_2)&&(gPassTrack_Store_Sector<=FLASH_PASTDATA_E_2) )
					{
						WriteBuffer2ToPage(gPassTrack_Store_Sector);
						gTimer=0;Clear_Exter_WatchDog();
						while(gTimer<500){}
						Clear_Exter_WatchDog();
					}
					OperateSPIEnd();
					CMinute_Temp=CMinute;
                }
           		*/
		    }
			/********************************************************\
			4,如果GPS数据无效,则进行相关的处理
			\********************************************************/
		    else
		    {
				gGPS_Invaild_Timer++;
				//如果超过1800秒持续无效点,则重新掉电处理GPS模块
				if(gGPS_Invaild_Timer>GPS_INVALID_COUNT)
				{
					gGPS_Invaild_Timer=0;
					gGeneral_Flag|=OFF_GPS_F_1;
					gOFF_Power_S=1;
				}
		    }
		}
		GPS_Buffer_Point=0;
		gGPS_Receive_Over=0;
		for(i=0;i<sizeof(GPS_Buffer);i++) GPS_Buffer[i]=0;
	}
	TAUARTCTL|=TAUARTIE;       //比较器A的中断允许
}
/********************************************************\
*	函数名:Receive_COM2(中断子程序)
	作用域:本地文件调用
*	功能:	利用比较器A的中断向量,进行模拟串口2的接收处理,处理接收GPS的数据
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
interrupt [TAUART_VECTOR] void Receive_COM2(void)
{
	TAUARTCTL&=~TAUARTIFG;	//清除比较器A的中断标志位
	if(RTI2&RECEIVE_FLAG)	//表示接收到一个字节完成
	{
		GPS_Buffer[GPS_Buffer_Point]=SBUFIN2;
		GPS_Buffer_Point++;
		if(GPS_Buffer_Point>=sizeof(GPS_Buffer))	GPS_Buffer_Point=0;
		gGPS_Receive_Over=0;
		RX2_Ready();
	}
}


/********************************************************\
*	函数名:Disp_Ask_Info()
	作用域:本地文件调用
*	功能:	接收到来自显示终端的按键请求信息,需要将这些信息上行给中心
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述
   Dim Instring As String
   Dim Buffer(10) As Byte
   Dim IObuffer(14) As Byte
   Dim InBuffer(10) As Byte
   Dim Savebuffer(5) As Byte

   Dim I

   Buffer(0) = &H10
   Buffer(1) = &H7A
   Buffer(2) = &H0
   Buffer(3) = &H1
   Buffer(4) = &H0
   Buffer(5) = &H0
   Buffer(6) = &H1  ' RMC
   Buffer(7) = &H0
   'buffer(7)=&H1C 在设置GSA,GSV,VTG,时,buffer(7)=&H1C
   Buffer(8) = &H10
   Buffer(9) = &H3


   IObuffer(0) = &H10
   IObuffer(1) = &HBC
   IObuffer(2) = &H0
   IObuffer(3) = &H7
   IObuffer(4) = &H7
   IObuffer(5) = &H3
   IObuffer(6) = &H0
   IObuffer(7) = &H0
   IObuffer(8) = &H0
   IObuffer(9) = &H2
   IObuffer(10) = &H4
   IObuffer(11) = &H0
   IObuffer(12) = &H10
   IObuffer(13) = &H3

   Savebuffer(0) = &H10
   Savebuffer(1) = &H8E
   Savebuffer(2) = &H26
   Savebuffer(3) = &H10
   Savebuffer(4) = &H3


   ' 使用 COM1。
   MSComm1.CommPort = 1
   ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
   MSComm1.Settings = "9600,O,8,1"
   ' 当输入占用时,
   ' 告诉控件读入整个缓冲区。
   MSComm1.InputLen = 0
   ' 打开端口。
   MSComm1.PortOpen = True
   ' 将 attention 命令送到调制解调器。
   MSComm1.Output = Buffer ' "ATV1Q0" & Chr$(13) ' 确保

   MSComm1.Output = IObuffer

   'MSComm1.Output = Savebuffer

   MSComm1.PortOpen = False

   ''''''''''''''
    MSComm1.CommPort = 1
   ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
   MSComm1.Settings = "9600,N,8,1"
   ' 当输入占用时,
   ' 告诉控件读入整个缓冲区。
   MSComm1.InputLen = 0
   ' 打开端口。
   MSComm1.PortOpen = True
   ' 将 attention 命令送到调制解调器。

   MSComm1.Output = Savebuffer

   MSComm1.PortOpen = False

\********************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -