15,440
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
/*
* 功能说明:解析NMEA语句中的GPGSA语句,提取第2,15,16,17个字段。
* 字段以','分开,并且字段有可能为空。
*/
static char *gsa = "$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*34";
int main(int argc,char* argv[])
{
int field = 0;
int i;
int loc;
float pdop,hdop,vdop;
for(i = 0; (gsa[i] != 0) && (gsa[i]!='*'); i++){/* '*' 或空格为结束符 */
if(gsa[i]==',') field++;/*当前字段*/
switch(field){
case 2:
sscanf(gsa + i + 1, "%d", &loc);/*从','下一字符开始sscanf*/
break;
case 15:
sscanf(gsa + i + 1, "%f", &pdop);
break;
case 16:
sscanf(gsa + i + 1, "%f", &hdop);
break;
case 17:
sscanf(gsa + i + 1, "%f", &vdop);
break;
default:
break;
}
}
printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",
loc, pdop, hdop, vdop);
return 0;
}
#include <stdio.h>
/*
* 功能说明:解析NMEA语句中的GPGSA语句,提取第2,15,16,17个字段。
* 字段以','分开,并且字段有可能为空。
*/
static char *gsa = "$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*34";
int main(int argc,char* argv[])
{
int field = 0;
int i;
int loc;
float pdop,hdop,vdop;
for(i = 0; (gsa[i] != 0) && (gsa[i]!='*'); i++) /* '*' 或空格为结束符 */
{
if(gsa[i]==',')
{
field++; /*当前字段*/
}
else
{
continue;
}
switch(field)
{
case 2:
if (gsa[i+1] != ',')
{
sscanf(gsa + i + 1, "%d", &loc);/*从','下一字符开始sscanf*/
}
else
{
loc = 0; //loc置无效标志
}
break;
case 15:
if (gsa[i+1] != ',')
{
sscanf(gsa + i + 1, "%f", &pdop);
}
else
{
pdop = 0; //pdop置无效标志
}
break;
case 16:
if (gsa[i+1] != ',')
{
sscanf(gsa + i + 1, "%f", &hdop);
}
else
{
hdop = 0; //hdop置无效标志
}
break;
case 17:
if (gsa[i+1] != ',')
{
sscanf(gsa + i + 1, "%f", &vdop);
}
else
{
vdop = 0; //vdop置无效标志
}
break;
default:
break;
}
}
printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",
loc, pdop, hdop, vdop);
return 0;
}
#include <stdio.h>
#include <string.h>
/*
* 功能说明:解析NMEA语句中的GPGSA语句,提取第2,15,16,17个字段。
* 字段以','分开,并且字段有可能为空。
*/
static char *gsa = "$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*34";
int main(int argc,char* argv[])
{
int field = 0;
int i;
int loc;
float pdop,hdop,vdop;
/******************** BETTER SOLUTION */
#define MAX_GSA 256
char *iter = gsa;
for(iter = strchr(iter, ','); iter; iter = strchr(iter, ',')) {
if (*iter)
++iter;
++field;
if (field == 2)
sscanf(iter, "%d", &loc);
if (field == 15)
sscanf(iter, "%f", &pdop);
if (field == 16)
sscanf(iter, "%f", &hdop);
if (field == 17)
sscanf(iter, "%f", &vdop);
}
printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",
loc, pdop, hdop, vdop);
/******************** BETTER SOLUTION */
for(i = 0; (gsa[i] != 0) && (gsa[i]!='*'); i++){/* '*' 或空格为结束符 */
if (gsa[i]==',')
field++;/*当前字段*/
switch(field){
case 2:
sscanf(gsa + i + 1, "%d", &loc);/*从','下一字符开始sscanf*/
break;
case 15:
printf(gsa + i + 1); /*这两句可以帮忙发现bug*/
printf("---field: %d\n", field); /*同一field不该多次出现*/
sscanf(gsa + i + 1, "%f", &pdop);
while (gsa[i+1] && gsa[i+1] != ',') /*hack fix*/
++i;
break;
case 16:
printf(gsa + i + 1);
printf("---field: %d\n", field);
sscanf(gsa + i + 1, "%f", &hdop);
while (gsa[i+1] && gsa[i+1] != ',')
++i;
break;
case 17:
printf(gsa + i + 1);
printf("---field: %d\n", field);
sscanf(gsa + i + 1, "%f", &vdop);
while (gsa[i+1] && gsa[i+1] != ',')
++i;
break;
default:
break;
}
}
printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",
loc, pdop, hdop, vdop);
return 0;
}
#include<string>
#include<vector>
#include <stdio.h>
using namespace std;
/*
* 功能说明:解析NMEA语句中的GPGSA语句,提取第2,15,16,17个字段。
* 字段以','分开,并且字段有可能为空。
*/
static char *gsa = "$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*34";
vector<string> ExtractStrings(string sSource, char delim, bool bEnableEmpty);
int main(int argc,char* argv[])
{
vector<string> vecGSA = ExtractStrings(gsa,',',true);
printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",
atoi(vecGSA[2].c_str()), atof(vecGSA[15].c_str()), atof(vecGSA[16].c_str()), atof(vecGSA[17].c_str()));
return 0;
}
//////////////////////////////////////////////////////////////////////////
/// [UT]分割字符串
/// 位于字符串末尾的分割符总是被忽略
/// @param sSource 待分割的字符串
/// @param delim 分割字符
/// @param bEnableEmpty 是否允许空字符串,如果该参数设为true,则相连的两个
/// 分隔符之间认为存在一个空串(该参数默认值为false)
/// @return 字符串列表
//////////////////////////////////////////////////////////////////////////
vector<string> ExtractStrings(string sSource, char delim, bool bEnableEmpty = false)
{
string::size_type pos1, pos2;
vector<string> strParams;
pos2 = 0;
while (pos2 != string::npos)
{
if (bEnableEmpty)
{
if (sSource[pos2] == delim)
{
pos2 += 1;
strParams.push_back("");
continue;
}
}
pos1 = sSource.find_first_not_of(delim, pos2);
if (pos1 == string::npos)
break;
pos2 = sSource.find_first_of(delim, pos1 + 1);
if (pos2 == string::npos)
{
if (pos1 != sSource.size())
strParams.push_back(sSource.substr(pos1));
break;
}
strParams.push_back(sSource.substr(pos1, pos2 - pos1));
pos2 += 1;
}
return strParams;
}
if(gsa[i] == ',')
{
field++;/*当前字段*/
}
else
{
continue;
}