sscanf strstr gps 代码杂烩

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");
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sscanf函数是一个在C语言中常用的函数,用于将字符流中的数据按照指定格式进行分割和处理。在给定的字符流中,sscanf函数可以通过指定的格式字符串,将特定的数据提取出来,并存储到对应的变量中。 关于sscanf函数的使用,我找到了两个例子来帮助解释。引用中的例子展示了如何使用sscanf函数来提取一个句子中的字符串和整数。通过指定格式字符串"%s %*s %d",sscanf函数会将句子中的第一个字符串和第三个整数提取出来并存储到相应的变量中。 另一个例子在引用中展示了更复杂的用法。通过指定格式字符串"%[^','],%[^','],%[^','],%s",sscanf函数可以将一个包含多个字段的字符串分割成多个部分,并将这些部分存储到对应的变量中。这个例子展示了如何从一个包含字段的字符串中提取字符串、浮点数和整数。 通过这些例子,我们可以看到sscanf函数的灵活性。通过不同的格式字符串,我们可以根据需要将字符流中的数据进行提取和处理。对于更详细的sscanf函数用法,可以参考引用中提供的链接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [GPS项目实战系列之:再谈一次GPS数据解析](https://blog.csdn.net/wangwenxue1989/article/details/104710228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值