csdn 搜集的,不一一列出....
char *phead = {$GPGGA,071432.00,3036.01954594,N,10405.71174136,E,4,21,0.6,493.68986996,M,-42.80,M,02,3077*4B}
sscanf((const char*)(p_head),\
",%f,%lf,%c,%lf,%c,%d,%d,%f,%lf,%c,%f,%c,%d,%d*%2X",\
&gps.gga.Utc,\
&gps.gga.Lat,\
&gps.gga.N_S,\
&gps.gga.Lon,\
&gps.gga.E_W,\
&gps.gga.Qual,\
&gps.gga.Sat,\
&gps.gga.Hdop,\
&gps.gga.ALT,\
&gps.gga.A_units,\
&gps.gga.Undulation,\
&gps.gga.U_units,\
&gps.gga.Age,\
&gps.gga.Stn_ID,\
&gps.gga.Check_Sum);
buf="$GNRMC,004505.000,A,2241.001098,N,11416.656622,E,0.028,129.792,201015,,E,A*3F";
sscanf((char const*)buf,"%*[^,],%6s%*[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",
&gps_location_info_data.time[0],
&gps_location_info_data.location_valid,
&gps_location_info_data.latitude[0],
&gps_location_info_data.latitude_NS,
&gps_location_info_data.longitude[0],
&gps_location_info_data.longitude_EW,
&gps_location_info_data.speed[0],
&gps_location_info_data.speed_direction[0],
&gps_location_info_data.date[0]
);
————————————————
版权声明:本文为CSDN博主「橙蓄源」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gocy123/article/details/49283063
void gprmc_analyse(char *buff)
{
char *ptr=NULL;
struct gprmc gprmc_data;
/* FIXME:
* 1. 002743.261 the last '261' will change so sometime can not match
* 2. only attach once from buff, maybe should use while(ptr != NULL) ...
*/
/* eg: $GPRMC,002743.261,V,,,,,0.00,0.00,060180,,,N*45 */
if(NULL != (ptr=strstr(buff, "$GPRMC"))) {
sscanf(ptr, "$GPRMC,%d.261,%c,%f,N,%f,E,%f,%f,%d,,,%c*",
&(gprmc_data.time), &(gprmc_data.pos_state), &(gprmc_data.latitude),
&(gprmc_data.longitude), &(gprmc_data.speed), &(gprmc_data.direction),
&(gprmc_data.date), &(gprmc_data.mode));
print_gprmc(&gprmc_data);
}
}
void gps_analyse(char *buff)
{
gprmc_analyse(buff);
//gpgsv_analyse(buff); // do more type parse
}
gps.c
#ifndef __GPS_H__
#define __GPS_H__
struct gprmc
{
unsigned int time;/* gps定位时间 */
char pos_state;/*gps状态位*/
float latitude;/*纬度 */
float longitude;/* 经度 */
float speed; /* 速度 */
float direction;/*航向 */
unsigned int date; /*日期 */
float declination; /* 磁偏角 */
char dd;
char mode;/* GPS模式位 */
};
extern void gps_analyse(char *buff);
#endif
int gps_analyse (char *buff,GPRMC *gps_data)
{
char *ptr = NULL;
if(gps_data==NULL)
{
return -1;
}
if(strlen(buff)<10)
{
return -1;
}
/*如果buff字符串中包含字符"$GPRMC"则将$GPRMC的地址赋值给ptr*/
if(NULL==(ptr=strstr(buff,"$GPRMC")))
{
return -1;
}
sscanf(ptr,"$GPRMC,%d.000,%c,%f,N,%f,E,%f,%f,%d,,,%c*",&(gps_data->time),&(gps_data->pos_state),&(gps_data->latitude),&(gps_data->longitude),&(gps_data->speed),&(gps_data->direction),&(gps_data->date),&(gps_data->mode));
/*sscanf函数为从字符串输入,上面这句话的意思是将ptr内存单元的值作为输入分别输入到后面的结构体成员*/
return 0;
} /* ----- End of gps_analyis() ----- */
————————————————
版权声明:本文为CSDN博主「C_Aya」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baweiyaoji/article/details/72902091
1. 时间,这个是格林威治时间即世界时间(UTC),把它转换成我们用的北京时间(BTC),在这个时间基础上加8个小时。
2. 经纬度,GPRMC返回的纬度数据位ddmm.mmmm格式即度分格式,我们把它转换成常见的度分秒的格式,计算方法:如接收到的纬度是:3029.60430
3029.60430/100=30.2960430可以直接读出30度, 3029.60430–30*100=29.60430, 可以直接读出29分
(29.60430–29)*60 =0.60430*60=36.258读出36秒, 所以纬度是:30度29分36秒。
3. 南北纬东西经,N:北纬。S:南纬。E:东经。W:西经。
4. 速率,GPRMC返回的速率值是海里/时,单位是节,把它转换成千米/时,换算为:1海里=1.85公里,把得到的速率乘以1.85。
5. 航向,指的是偏离正北的角度
6. 日期,GPRMC的日期格式为:ddmmyy,如:040617表示2017年06月04日,这个日期是准确的,不需要转换。
int gps_analysis(char *buff,GPRMC *gps_date)
{
char *ptr=NULL;
if(gps_date==NULL)
return -1;
if(strlen(buff)<10)
return -1;
if(NULL==(ptr=strstr(buff,"$GPRMC")))
return -1;
sscanf(ptr,"$GPRMC,%d.000,%c,%f,N,%f,E,%f,%f,%d,,,%c*",&(gps_date->time),&(gps_date->pos_state),&(gps_date->latitude),&(gps_date->longitude),&(gps_date->speed),&(gps_date->direction),&(gps_date->date),&(gps_date->mode));
return 0;
} /* ----- End of if() ----- */
char strstr( char *str, char substr );
【参数说明】str为要检索的字符串,substr为要检索的子串。
【返回值】返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。
if(NULL==(ptr=strstr(buff,”$GPRMC”)))
return -1;
这里返回的是GPRMC所在位置的地址。
int sscanf( string str, string fmt, mixed var1, mixed var2 … );
作用:从一个字符串中读进与指定格式相符的数据.
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
假设GPRMC为如下信息:
$GPRMC,062363.00,A,2236.33923,N,11402.35855,E,0.304,306.80,020411,,,A*62
sscanf(ptr,”$GPRMC,%d.000,%c,%f,N,%f,E,%f,%f,%d,,,%c*”,&(gps_date->time),&(gps_date->pos_state),&(gps_date->latitude),&(gps_date->longitude),&(gps_date->speed),&(gps_date->direction),&(gps_date->date),&(gps_date->mode));
则该函数将ptr中以GPRMC为起始地址的内容格式化输入到结构体的各成员中去,结构体定义在”gps.h”中。
typedef struct __gprmc__
{
UINT time; //格林威治时间
char pos_state; //定位状态
float latitude; //纬度
float longitude; //经度
float speed; //移动速度
float direction; //方向
UINT date; //日期
float declination; //磁偏角
char dd; //磁偏角方向
char mode;
}GPRMC;
while(1)
{
sleep(2);
nread = read(fd,gps_buff,sizeof(gps_buff));
if(nread<0)
{
printf("read GPS date error!!\n");
return -2;
}
printf("gps_buff: %s\n", gps_buff);
memset(&gprmc, 0 , sizeof(gprmc));
gps_analysis(gps_buff,&gprmc);
print_gps(&gprmc);
//***************************get gpfdp data**************************
int gpfdp_analyse(char *buff,GPFPD_INFO *gpfdp_data)
{
char *wellhandled_temp;
size_t i=0,reti=0;
if(strlen(buff)<32)
{
return -1;// length of frame is 98,if datalength is too short,return.
}
if ((wellhandled_temp = strstr(buff,"$GPFPD")) != NULL)
{
for (i=0; i<strlen(wellhandled_temp); i++)
{
if (wellhandled_temp[i] == '\n')
{
wellhandled_temp[i] = '\0';
}
}
}
//printf("wellhandled_temp=%s\n\n",wellhandled_temp);
reti=sscanf(wellhandled_temp,"$GPFPD,%d,%[^,],%f,%f,%f,%lf,%lf,%f,%f,%f,%f,%f,%i,%i,%[^*]",
&(gpfdp_data->GPSWeek),gpfdp_data->GPSTime,&(gpfdp_data->Heading),&(gpfdp_data->Pitch),&(gpfdp_data->Roll), \
&(gpfdp_data->Latitude),&(gpfdp_data->Longitude),&(gpfdp_data->Altitude),\
&(gpfdp_data->Ve),&(gpfdp_data->Vn),&(gpfdp_data->Vu),\
&(gpfdp_data->Baseline),&(gpfdp_data->NSV1),&(gpfdp_data->NSV2),\
gpfdp_data->Status);
//printf("reti=%d\n",reti);
//wellhandled_temp=$GPFPD,1356,9013.40,0.000,0.000,0.000,0.000000000,0.000000000,0.000,0.000,0.000,0.000,0.000,0,0,0*79
return 0;
}
————————————————
版权声明:本文为CSDN博主「风一样的航哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41579872/article/details/120000875
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned int UINT32;
typedef unsigned long long UINT64;
typedef UINT32 BOOL;
#define TRUE 1
#define FALSE 0
/* 日期时间结构体 8 bytes */
#pragma pack(1)
typedef union _ZGDateTime
{
UINT64 Ticks;
struct _tm
{
UINT32 US : 12;
UINT32 MS : 12;
UINT32 Second : 8;
UINT32 Minute : 6;
UINT32 Hour : 5;
UINT32 Day : 5;
UINT32 Month : 4;
UINT32 Year : 12;
}tm;
}ZGDateTime;
/* 定义GPS信息结构体 */
typedef struct _GPS_INFO_STRU
{
ZGDateTime dt;
char status; // 状态A-有效,V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。
float latitude_value; // 纬度值
char latitude; // 纬度为N南纬或S北纬
float longtitude_value; // 经度值
char longtitude; // 经度标明东西半球,E为东半球、W为西半球
float speed; // 速度
float azimuth_angle; // 方位角
}GPS_INFO;
/*获取GPS信息,只处理$GPRMC*/
BOOL GetGpsInfo(const char *pStr, GPS_INFO *pGpsInfo)
{
BOOL bl;
int i;
int year,month,day,hour,minute,second,ms;
ZGDateTime *dt;
dt = &pGpsInfo->dt;
memset(pGpsInfo, 0, sizeof(GPS_INFO));
i = sscanf(pStr, "$GPRMC,%2d%2d%2d.%d\
%*[^VAva]%c,\
%f%*[^SNsn]%c,\
%f%*[^EWew]%c,\
%f,%f,\
%2d%2d%2d",
&hour, &minute, &second, &ms,
&pGpsInfo->status, &pGpsInfo->latitude_value, &pGpsInfo->latitude,
&pGpsInfo->longtitude_value, &pGpsInfo->longtitude,
&pGpsInfo->speed, &pGpsInfo->azimuth_angle,
&day, &month, &year
);
if(i >= 14 && (pGpsInfo->status == 'A' || pGpsInfo->status == 'a'))
{
dt->tm.Year = 2000+year;
dt->tm.Month = month;
dt->tm.Day = day;
dt->tm.Hour = hour;
dt->tm.Minute = minute;
dt->tm.Second = second;
dt->tm.MS = ms;
dt->tm.US = 0;
bl = TRUE;
}
else
{
bl = FALSE;
}
return bl;
}
int main()
{
const char TestGpsText[]={"$GPRMC,024813.640,a,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50"};
GPS_INFO gpsInfo;
GPS_INFO *pGpsInfo;
ZGDateTime *dt;
BOOL bl;
pGpsInfo = &gpsInfo;
dt = &pGpsInfo->dt;
bl = GetGpsInfo(TestGpsText, pGpsInfo);
if(bl == TRUE)
{
printf( "%s %s\r\n", __DATE__, __TIME__);
printf( "GPS信息:\r\n");
printf( "时 间:%04d-%02d-%02d %02d:%02d:%02d %03d.%03d\r\n",
dt->tm.Year, dt->tm.Month, dt->tm.Day,
dt->tm.Hour, dt->tm.Minute, dt->tm.Second,
dt->tm.MS, dt->tm.US);
printf( "状 态:%s\r\n", pGpsInfo->status == 'A' ? "有效" : "无效");
printf( "经 度:%s%0.4f度\r\n", pGpsInfo->longtitude == 'E'? "东经" : "西经", pGpsInfo->longtitude_value);
printf( "纬 度:%s%0.4f度\r\n", pGpsInfo->latitude == 'N'? "北纬" : "南纬", pGpsInfo->latitude_value);
printf( "速 度:%.3f\r\n", pGpsInfo->speed);
printf( "方位角:%.3f\r\n\r\n", pGpsInfo->azimuth_angle);
}
else
{
printf( "GPS数据无效\r\n");
}
system("pause");
}