
#include
#include
外部结构_GPS_Real_buf
{
char数据[256]; //定义GPS输入缓冲区
volatile无符号短rx_pc; //接收指针
} GPS_Real_buf; // GPS接收数据缓冲区
外部结构_GPS_Information
{
unsigned char Real_Locate; //实时定位有效位
unsigned char位于; //位置有效位
unsigned char Locate_Mode; // 2D或3D定位模式
char UTC_Time [7]; //时间
char UTC_Date [7]; //日期
char纬度[10]; //纬度
char NS_Indicator; // N =北半球,S =南半球
char经度[11]; //经度
char EW_Indicator; // E =东经,W =西经
双倍速度; //地面速度
双道菜; //地面路线
双重PDOP; //位置精度
双HDOP; //水平精度
双VDOP; //垂直精度
双MSL_Altitude; // MSL高度
unsigned char Use_EPH_Sum; //使用的卫星数
unsigned char User_EPH [12]; //当前搜索到的卫星号
无符号短EPH_State [12] [4]; //当前使用的12颗卫星的数量,高度,方位角,信噪比
} GPS_Information; // GPS信息
/ ********************************************** **************************************************** **** ********
**函数信息: void USART2_IRQHandler(void)
**功能说明: UART2中断服务功能
**输入参数: 无
**输出参数: 无
*************************************************** ****************************************************** ******* /
void USART2_IRQHandler(void)//串行端口2中断服务程序
{
unsigned char Recv;
if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET)//接收中断
{
Recv = USART_ReceiveData(USART2); //接收数据
如果(Recv =='$')
{
GPS_Real_buf.rx_pc = 0;
}
其他
{
如果(GPS_Real_buf.rx_pc { GPS_Real_buf.rx_pc ++; } } GPS_Real_buf.data [GPS_Real_buf.rx_pc] =接收; if(Recv =='\ r')//当接收到的数据为0x0D时开始处理GPS数据 { 如果(Real_Process_Enabled ==有效) { 如果(Calc_GPS_Sum(GPS_Real_buf.data)==有效) { Creat_DH_Index(GPS_Real_buf.data); Real_GPS_Command_Process(); } } } } if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)== SET)//溢出中断 { USART_ClearFlag(USART2,USART_FLAG_ORE); //清除溢出位 USART_ReceiveData(USART2); //读取DR } } / ********************************************** **************************************************** **** ******** **函数信息: void Creat_DH_Index(字符*缓冲区) **功能描述: 查找所有逗号位置并创建索引 **输入参数: 接收GPS数据的缓冲区 **输出参数: 在全局变量数组中创建一个逗号索引,原始GPS数据中的逗号将替换为0x00 *************************************************** ****************************************************** ******* / unsigned char DH_id_sep [32]; //全局变量数组,最多32个逗号索引 void Creat_DH_Index(字符*缓冲区) { unsigned short i,len; unsigned char idj; 内存集(DH_id_sep,0,sizeof(DH_id_sep)); len = strlen(缓冲区); 对于(i = 0,idj = 0;我 { if(缓冲区[i] ==',') { DH_id_sep [idj] = i; idj ++; 缓冲区[i] = 0x00; } } } / ********************************************** **************************************************** **** ******** **函数信息: char * Real_Process_DH(char *缓冲区gps接收机使用,无符号char num) **功能说明: 找到GPS数据的第N个参数的偏移量 **输入参数: 创建索引后接收GPS数据缓冲区 **输出参数: 返回第N个“,”之后的信息,可以在*缓冲区有效并创建索引后执行. *************************************************** ****************************************************** ******* / 字符* Real_Process_DH(字符*缓冲区,无符号字符数) { 如果(数字<1) 返回和缓冲[0]; 返回和缓冲[DH_id_sep [num-1] + 1]; } / ********************************************** **************************************************** **** ******** **函数信息: void Real_GPS_Command_Process(无效) **功能描述: 处理参数索引数据并将其填写到GPS数据结构中 **输入参数: **输出参数: *************************************************** ****************************************************** ******* / void Real_GPS_Command_Process(无效) { char * temp; unsigned char i,j,zhen; if(strstr(GPS_Real_buf.data,“ GPGGA”))// $ GPGGA,112118.000,3743.5044,N,11540.5393,E,1,06,1.6,15.3,M,-9.1,M ,, 0000 * 7E { GPS_Information.Use_EPH_Sum = atof(Real_Process_DH(GPS_Real_buf.data,7)); //第七个参数是使用的卫星数 GPS_Information.MSL_Altitude = atof(Real_Process_DH(GPS_Real_buf.data,9)); //第九个参数是海拔高度 返回; } if(strstr(GPS_Real_buf.data,“ GPGSA”))//$GPGSA,A,3,28,17,11,09,08,07,,,,,,3.4,1.6,3.0*3B { temp = Real_Process_DH(GPS_Real_buf.data,2); //第二个参数是定位模式 if(((* temp =='2')||(** temp =='3')) GPS_Information.Locate_Mode = * temp; 其他 GPS_Information.Locate_Mode =无效; for(i = 0; i <12; i ++)//总共最多12星 { GPS_Information.User_EPH [i] = atof(Real_Process_DH(GPS_Real_buf.data,i + 3)); //使用的卫星号从第三个参数开始 } GPS_Information.PDOP = atof(Real_Process_DH(GPS_Real_buf.data,15)); //第十五个参数是位置精度 GPS_Information.HDOP = atof(Real_Process_DH(GPS_Real_buf.data,16)); //第16个参数是水平精度 GPS_Information.VDOP = atof(Real_Process_DH(GPS_Real_buf.data,17)); //第17个参数是垂直精度 返回; } if(strstr(GPS_Real_buf.data,“ GPRMC”))// $ GPRMC,112118.000,A,3743.5044,N,11540.5393,E,0.25,198.81,130613 ,,, A * 67 { temp = Real_Process_DH(GPS_Real_buf.data,1); //第一个参数是时间 如果(* temp!= 0) memcpy(GPS_Information.UTC_Time,temp,6); if(*(Real_Process_DH(GPS_Real_buf.data,2))=='A')//第二个参数 { GPS_Information.Real_Locate =有效; //实时数据有效 GPS_Information.Located =有效; } 其他 { GPS_Information.Real_Locate =无效; //无效的实时数据 } temp = Real_Process_DH(GPS_Real_buf.data,3); //第三个参数是纬度 如果(((* temp> = 0x31)&&(* temp <= 0x39)) { memcpy(GPS_Information.Latitude,tempgps接收机使用,9); GPS_Information.Latitude [9] = 0; } 其他 { GPS_Information.Latitude [0] ='0'; GPS_Information.Latitude [1] = 0; } GPS_Information.NS_Indicator = *(Real_Process_DH(GPS_Real_buf.data,4)); //第四个参数是北和南 temp = Real_Process_DH(GPS_Real_buf.data,5); //第五个参数是经度 如果(((* temp> = 0x31)&&(* temp <= 0x39)) { memcpy(GPS_Information.Longitude,temp,10); GPS_Information.Longitude [10] = 0; } 其他 { GPS_Information.Longitude [0] ='0'; GPS_Information.Longitude [1] = 0; } GPS_Information.EW_Indicator = *(Real_Process_DH(GPS_Real_buf.data,6)); //第六个参数是东西 GPS_Information.Speed = atof(Real_Process_DH(GPS_Real_buf.data,7)); //第七个参数是速度 GPS_Information.Course = atof(Real_Process_DH(GPS_Real_buf.data,8)); //第八个参数为标题 temp = Real_Process_DH(GPS_Real_buf.data,9); //第九个参数是日期 如果(* temp!= 0) { memcpy(GPS_Information.UTC_Date,temp,6); } 返回; } if(strstr(GPS_Real_buf.data,“ GPGSV”))// $ GPGSV,3,1,11,28,73,321,32,17,39,289,43,11,38,053,17,09,37,250,41 * 78 { zhen = atof(Real_Process_DH(GPS_Real_buf.data,2)); //获取当前帧号 如果((zhen <= 3)&&(zhen!= 0)) { 对于(i =(zhen-1)* 4,j = 4; i { GPS_Information.EPH_State [i] [0] = atof(Real_Process_DH(GPS_Real_buf.data,j ++)); //以星号 GPS_Information.EPH_State [i] [1] = atof(Real_Process_DH(GPS_Real_buf.data,j ++)); //取仰角 GPS_Information.EPH_State [i] [2] = atof(Real_Process_DH(GPS_Real_buf.data,j ++)); //取方位角 GPS_Information.EPH_State [i] [3] = atof(Real_Process_DH(GPS_Real_buf.data,j ++)); //获取信噪比 } } 返回; } } / ********************************************** **************************************************** **** ******** **函数信息: 无符号字符Calc_GPS_Sum(常量字符*缓冲区) **功能描述: 计算GPS校验和 **输入参数: 接收完整的GPS数据 **输出参数: *************************************************** ****************************************************** ******* / #include 无符号字符gps_sum = 0; 未签名的字符Calc_GPS_Sum(常量字符*缓冲区) { unsigned char i,j,k,sum; sum = 0; for(i = 1; i <255; i ++)//我从1开始并在$起始字符上方闪烁 { if((缓冲区[i]!='*')&&(缓冲区[i]!= 0x00))//判断结束字符 { sum ^ =缓冲区[i]; // GPS校验和算法是XOR } 其他 { 休息; } } j =缓冲区[i + 1]; //在结束字符后加上两个字符 k =缓冲区[i + 2]; if(isalpha(j))//确定字符是否为英文字母,如果为英文字母,则返回非零值,否则返回零 { if(isupper(j))// //判断该字符为大写英文字母时,返回非零值,否则返回零 { j- = 0x37; //强制为十六进制 } 其他 { j- = 0x57; //强制为十六进制 } } 其他 { 如果(((j> = 0x30)&&(j <= 0x39)) { j- = 0x30; //强制为十六进制 } } if(isalpha(k))//确定字符是否为英文字母,如果为英文字母,则返回非零值,否则返回零 { if(isupper(k))// //判断该字符为大写英文字母时,返回非零值,否则返回零 { k- = 0x37; //强制为十六进制 } 其他 { k- = 0x57; //强制为十六进制 } } 其他 { 如果(((k> = 0x30)&&(k <= 0x39)) { k- = 0x30; //强制为十六进制 } } j =(j << 4)+ k; //强制合并为十六进制 gps_sum = j; 如果(sum == j) { 返回有效值; //校验和是正常的 } 其他 { 返回无效; //校验和错误 } }北斗GPS模板相关产品 北斗GPS定位时间模板GM-87 RES SMT360北斗GPS计时模板




本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-202568-1.html
加油