まず、NMEAコードであるかを理解するために、良い説明を直接処理していない、そこにあります
http://www.gpsbaby.com/wz/nmea.html
まず、GPS情報が含まれているテキストの行を見つけるために、すべての、それはどこ行の文字列であるGPGGA
$ GPGGA、052551.00,3409.341502、N、10853.663318、E、1,05,1.2,459.4、M、-28.0、M ,, * 4E
実用的な工学的用途では、(屋内GPSで情報を得ることができなくなり、このようなデバイスのような)様々な理由であることができる、リアルタイムでGPS情報が正確で完全な値を得ることができない、GPS.logファイルに、いくつかあるだろう不完全なGPS情報。
GPGGA ,,,,,, ,,,,,,,, * 0 $ 66 //これは屋内で私のGPSの位置情報であります
そうするために、完全なテキスト行の有無を判断することは情報がGPGGA、N / S、W /確認しなければならないGPS E 3つの文字列が存在しています。次いで、緯度の位置特定、値を抽出することができます。
次のようにコードがあります
#includeは<sys / types.h>に
する#include <SYS / stat.h>
の#include <ERRNO.H>
する#include <unistd.h>
の#include <fcntl.h>
する#include <stdio.hに>
する#include <メモリ.H>
の#include <STDLIB.H>
の#include <string.hの>
の#define FILE_PATH "/home/mr_han/code/exp/GPS.log"
の#define READ_MAX 150
の#define GPS_DATA 15
の#define GPS_KEY "GPGGA"
の#define BOOLチャー
の#define真1つ
の#define偽0
ボイドgps_cal(ダブルP、文字Q、INT *角度、フロート*分)//将原始GPS信息转换为度分形式
{
*角= P / 100。
*分=(P- *角* 100)/ 60。
}
INT Search_comma(チャー* pを、
}
戻りL;
}
/ *は、ファイルCからの完全なGPS情報を見つけ、パラメータは、ファイルパスであった(名)、緯度、経度、緯度、経度* /
BOOLのget_gps_data(CONSTのchar * file_nameに、ダブル* P、二重* Q、CHAR *経度、チャー*緯度)
{
CHAR * RW = NULL;
= 0のint LOCATION、I = 0、N = 0、S = 0、E = 0、W = 0である;
[READ_MAX] read_line_buffをCHAR、 GPS [GPS_DATA];
のmemset(GPS、0、GPS_DATA);
FILE * FD =のfopen(FILE_PATH、 "R&LT")、
IF(FD == NULL)
{
のprintf( "ファイルを開くエラー\ N-!");
偽に戻ります。
}
一方(FEOF(FD)!)
{
memsetの(read_line_buff、0、READ_MAX);
RW =関数fgets(read_line_buff、READ_MAX、FD); //各列の読み出し、ファイルから
IF(RW == NULL)
偽に戻ります。
(!STRSTR(read_line_buff、GPS_KEY)= NULL)IF
{
N =(?strchr(read_line_buff、 'N')== NULL 0 :. 1);
S =(strchr(read_line_buff、 'S')== NULL 0:? 2);
E =(strchr(read_line_buff、 'E')== NULL 0 :. 4);?
Wは== NULL 0 =(strchr(read_line_buff、 'Wは')である:7); /
I = N + S + ; Wは+ Eである
の種類を決定するために、異なる重みの4つの組み合わせに、/ *完全なGPS情報のみ可能緯度経度のNEで、それぞれNW経度緯度、SEの経度緯度、経度緯度SW、 * /
//関数を呼び出すスイッチ(I)の代わりにケースGOTO文を使用することができる
{
ケース5:
*経度= 'E';
*緯度= 'N'、
I = 0;
FCLOSE(FD)、
後藤NE;
場合。6:
*経度= 'E';
*緯度= 'S';
I = 0。
FCLOSE(FD)。
GOTO SE;
、一方(read_line_buff [位置+ 1] = 'N'!)
。ケース8:
*経度= 'Wは';
*緯度= 'N'、
I = 0;
FCLOSE(FD)、
GOTO NW;
ケース9:
*経度= W 'は';
*緯度= 'S';
I = 0。
fcloseを(FD);
GOTO SW;
デフォルトは:続行;
}
}
}
NE:
RW = strchr(read_line_buff、 'N'); //最初の引数でstrchr二番目のパラメータファンクション文字列を探し、見つけリターンリターン空見つからないアドレス
read_line_buff - -位置= RW 1; // アドレスは、デジタルを得るために減算、この工程は、主にフロントコンマ緯度、$ GPGGA、052551.00,3409.341502、N N LOCATION即ち前カンマに標的化されます
位置= Search_comma(read_line_buff、場所) ; // その後、コンマ見つけるためにGPS情報に前方に位置する
* P = atof(GPS)を、
GPS [I ++] = read_line_buff [LOCATION ++];
のmemset(GPS、0、GPS_DATA);
I = 0;
。LOCATION = LOCATIONの+ 3; // 3409.341502、N、10853.663318、E、緯度の割り当てが完了し、Nフロントコンマのうち位置単純に立ち直ると経度情報が3で見つけることができます
しばらく(read_line_buff = 'E' [LOCATIONの+ 1]!)
GPS [I ++] = read_line_buff [LOCATION ++];
* Q = atof(GPS);
trueに戻ります。
SE:
; RWはstrchr(read_line_buff、 'S')を=
1 - read_line_buff - LOCATION = RW;
LOCATION = Search_comma(read_line_buff、LOCATION);
一方(read_line_buff [LOCATIONの+ 1] = 'S'!)
GPS [I ++] = read_line_buff [LOCATION ++ ];
* P = atof(GPS)
のmemset(GPS、0、GPS_DATA);
I = 0;
場所所在地+ = 3。
一方、(read_line_buff [位置+ 1] = 'E'!)
RW = strchr(read_line_buff、 'S')。
GPS [I ++] = read_line_buff [位置++]。
* Q = atof(GPS)。
trueを返します。
NW:
RW = strchr(read_line_buff、 'N')。
場所= RW - read_line_buff - 1。
位置= Search_comma(read_line_buff、位置)
一方、(read_line_buff [位置+ 1] = 'N'!)
GPS [I ++] = read_line_buff [位置++]。
* P = atof(GPS)。
memset(GPS、0、GPS_DATA)。
I = 0;
位置=場所+ 3。
一方、(read_line_buff [位置+ 1] = 'W'が!)
gpsの[I ++] = read_line_buff [位置++]。
* Q = atof(GPS)。
trueを返します。
SW:
場所= RW - read_line_buff - 1。
位置= Search_comma(read_line_buff、位置)
しばらく(read_line_buff [LOCATIONの+ 1] = 'S'!)
GPS [I ++] = read_line_buff [LOCATION ++];
* P = atof(GPS); // atof文字列の後に二重の機能が戻る、それ以外の戻り0変換すべき
memsetの(GPS、0、GPS_DATA);
I = 0;
LOCATION = LOCATIONの+ 3;。
しばらく(read_line_buff [ロケーションの+ 1] = 'Wは'!)
GPS [I ++] = read_line_buff [LOCATION ++];
* Q = atof(GPS) ;
trueに戻る;
}
のchar *印刷(Pチャー)
{
スイッチ(P)
{
ケース'S':リターン"南緯";
ケース'S':リターン"南緯";
ケース'N':リターン"緯度"。
ケース「N」:リターン「緯度」、
ケースW「が」:リターン「経度」、
ケース「W」:リターン「経度」。
デフォルト:リターン「エラーマトリックス」;
}
ケース「E」:リターン「西」;
ケース「E」:リターン「西经」。
}
int型のmain()
{
int型の角= 0。
= 0分フロート。
= 0チャー経度、緯度= 0。
二重gps_g = 0、gps_i = 0; // gps_g经度gps_i纬度
get_gps_data(FILE_PATH、&gps_i、&gps_g、&経度、及び緯度)。
printf( "GPS:%LF%C、%LF%C \ n"は、gps_i、緯度、gps_g、経度)。
/ * gps_cal(gps_g、経度、および角度、&分)。
printf( "%sの%D%度F分"、プリント(経度)、角度、分)。
gps_cal(gps_i、緯度、&角度、&分)。
printf( "%sの%D%度F分\ n"は、プリント(緯度)、角度、分); * /
gps_cal(gps_i、緯度、&角度、&分)。
printf( "%sの%D%度F分"、プリント(緯度)、角度、分)。
printf( "%sの%D%度F分\ n"は、プリント(経度)、角度、分)。
0を返します。
}
結果は以下のとおりであります
検査情報ファイル部分を取り付けるGPS.log
$GPVTG,,T,,M,,N,,K,N*2C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGGA,,,,,,0,,,,,,,,*66
$GPRMC,,V,,,,,,,,,,N*53
$GPGSV,3,1,10,10,49,322,50,12,15,119,40,20,78,352,49,25,09,151,39*7F
$GPGSV,3,2,10,32,28,272,48,14,13,260,,15,25,063,,21,41,203,*7B
$GPGSV,3,3,10,24,51,053,,27,,,*49
$GPVTG,,T,,M,,N,,K,N*2C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGGA,,,,,,0,,,,,,,,*66
$GPRMC,,V,,,,,,,,,,N*53
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,20,78,352,49,25,09,151,38*7E
$GPGSV,3,2,11,32,28,272,47,14,13,260,,15,25,063,,21,41,203,*75
$GPGSV,3,3,11,24,51,053,,27,,,,40,,,36*49
$GPGGA,052550.00,3409.338831,N,10853.658643,E,1,04,1.4,467.2,M,-28.0,M,,*43
$GPVTG,1.5,T,4.6,M,0.3,N,0.6,K,A*20
$GPRMC,052550.00,A,3409.338831,N,10853.658643,E,0.3,1.5,121218,3.1,W,A*25
$GPGSA,A,2,10,12,20,32,,,,,,,,,1.6,1.4,0.9*39
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,29,15,25,063,30*77
$GPGSV,3,2,11,20,78,352,49,21,41,203,22,24,51,053,33,25,09,151,39*7E
$GPGSV,3,3,11,32,28,272,47,27,,,,40,,,38*4C
$GPGGA,052551.00,3409.341502,N,10853.663318,E,1,05,1.2,459.4,M,-28.0,M,,*4E
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052551.00,A,3409.341502,N,10853.663318,E,0.0,1.5,121218,3.1,W,A*27
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,30,15,25,063,30*7F
$GPGSV,3,2,11,20,78,352,49,21,41,203,22,24,51,053,33,25,09,151,39*7E
$GPGSV,3,3,11,32,28,272,47,27,,,,40,,,38*4C
$GPGGA,052552.00,3409.340891,N,10853.662052,E,1,05,1.2,462.9,M,-28.0,M,,*42
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052552.00,A,3409.340891,N,10853.662052,E,0.0,1.5,121218,3.1,W,A*2E
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,30,15,25,063,27*79
$GPGSV,3,2,11,20,78,352,49,21,41,203,20,24,51,053,31,25,09,151,39*7E
$GPGSV,3,3,11,32,28,272,47,27,,,,40,,,38*4C
$GPGGA,052553.00,3409.340173,N,10853.661041,E,1,05,1.2,465.3,M,-28.0,M,,*4A
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052553.00,A,3409.340173,N,10853.661041,E,0.0,1.5,121218,3.1,W,A*2B
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,50,12,15,119,41,14,13,260,30,15,25,063,27*79
$GPGSV,3,2,11,20,78,352,49,21,41,203,20,24,51,053,32,25,09,151,39*7D
$GPGSV,3,3,11,32,28,272,46,27,,,,40,,,39*4C
$GPGGA,052554.00,3409.339925,N,10853.660214,E,1,05,1.2,466.6,M,-28.0,M,,*4D
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052554.00,A,3409.339925,N,10853.660214,E,0.0,1.5,121218,3.1,W,A*2A
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,31,15,25,063,28*77
$GPGSV,3,2,11,20,78,352,49,21,41,203,21,24,51,053,32,25,09,151,39*7C
$GPGSV,3,3,11,32,28,272,46,27,,,,40,,,39*4C
$GPGGA,052555.00,3409.340026,N,10853.659458,E,1,05,1.2,466.2,M,-28.0,M,,*48
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25
$GPRMC,052555.00,A,3409.340026,N,10853.659458,E,0.0,1.5,121218,3.1,W,A*2B
$GPGSA,A,2,10,12,20,24,32,,,,,,,,1.4,1.2,0.8*3A
$GPGSV,3,1,11,10,49,322,51,12,15,119,40,14,13,260,30,15,25,063,28*76
$GPGSV,3,2,11,20,78,352,49,21,41,203,22,24,51,053,32,25,09,151,39*7F
$GPGSV,3,3,11,32,28,272,46,27,,,,40,,,39*4C
$GPGGA,052556.00,3409.339490,N,10853.658951,E,1,05,1.2,465.8,M,-28.0,M,,*40
$GPVTG,1.5,T,4.6,M,0.0,N,0.0,K,A*25