C入門——GPSデータ処理
8732 ワード
タイトル内容:
NMEA-0183プロトコルは、異なるGPS(グローバル測位システム)ナビゲーション装置において統一的なBTCM(海事無線技術委員会)規格を確立するため、米国国家海洋電子協会(NMEA-The National Marine Electronics Associa-tion)が制定した通信プロトコル.GPS受信機は、NMEA-0183プロトコルの標準仕様に従って、位置、速度などの情報をシリアルポートを介してPC機、PDAなどの機器に伝送する.
NMEA-0183プロトコルはGPS受信機が遵守すべき標準プロトコルであり、現在GPS受信機で最も広く使用されているプロトコルでもあり、多くの一般的なGPS受信機、GPSデータ処理ソフトウェア、ナビゲーションソフトウェアはこのプロトコルを遵守または少なくとも互換性がある.
NMEA-0183プロトコルで定義される文は非常に多いが、一般的または最も互換性の広い文はGPGGA、GPGSA、GPGSV、GPRMC、GPVTG、GPGLLなどのみである.
$GPRMC文の形式は次のとおりです.
ここで文全体はテキスト行であり、行にはカンマ","で各フィールドが区切られており、各フィールドのサイズ(長さ)が異なり、ここでの例は可能であり、フィールドのサイズが上記の例文のようには考えられない.
ここで、「」はチェックサム識別子であり、その後ろの2桁はチェックサムであり、「$」と「」の間のすべての文字(この2つの文字を含まない)の異種値を表す16進数値である.上記の例文のチェックサムは16進数の50、すなわち10進数の80である.
ヒント:^演算子の役割は異或です.$と間のすべての文字を^演算(最初の文字と2番目の文字が異なっているか、結果が3番目の文字と異なっているか、このように推定されます)した後の値は65536に残りを取った結果、後の2つの16進数の値と等しいはずです.そうしないと、この文が転送中にエラーが発生したことを示します.この16進数値にはA-Fの大文字が表示されます.
今、あなたのプログラムは一連のGPS出力を読み込みます.$GPRMCも含まれています.他の文も含まれています.データの最後に、1行ずつ
データの終了を表します.
あなたのプログラムはそこからGPRMC文を探し出して、計算して検査して、その中の検査が正しいことを探し出して、しかもフィールド2はすでに位置した文を表して、そこから時間を計算して、北京時間に換算します.一度のデータには複数のGPRMC文が含まれ、最後の文で得られた北京時間を結果として出力します.
あなたのプログラムは必ず有効な$GPRMC文を読みます.
入力形式:
複数のGPS文があり、それぞれが折り返し改行で終わる.最後の行はENDの3つの大文字です.
出力フォーマット:
6桁の時間.
このうち、hhは2桁の時間で、2桁未満の場合は前に0を補う.mmは2桁の分で、2桁未満の場合は前に0を補う.ssは2桁の秒で、2桁未満の場合は前に0を補う.
サンプルを入力:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
END
出力サンプル:
10:48:13
時間制限:500 msメモリ制限:32000 kb
NMEA-0183プロトコルは、異なるGPS(グローバル測位システム)ナビゲーション装置において統一的なBTCM(海事無線技術委員会)規格を確立するため、米国国家海洋電子協会(NMEA-The National Marine Electronics Associa-tion)が制定した通信プロトコル.GPS受信機は、NMEA-0183プロトコルの標準仕様に従って、位置、速度などの情報をシリアルポートを介してPC機、PDAなどの機器に伝送する.
NMEA-0183プロトコルはGPS受信機が遵守すべき標準プロトコルであり、現在GPS受信機で最も広く使用されているプロトコルでもあり、多くの一般的なGPS受信機、GPSデータ処理ソフトウェア、ナビゲーションソフトウェアはこのプロトコルを遵守または少なくとも互換性がある.
NMEA-0183プロトコルで定義される文は非常に多いが、一般的または最も互換性の広い文はGPGGA、GPGSA、GPGSV、GPRMC、GPVTG、GPGLLなどのみである.
$GPRMC文の形式は次のとおりです.
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
ここで文全体はテキスト行であり、行にはカンマ","で各フィールドが区切られており、各フィールドのサイズ(長さ)が異なり、ここでの例は可能であり、フィールドのサイズが上記の例文のようには考えられない.
0:$GPRMC, ID, Recommended Minimum Specific GPS/TRANSIT Data(RMC)
1:UTC ,hhmmss.sss
2: ,A= ,V=
3: ddmm.mmmm, ( 0)
4: N( ) S( )
5: dddmm.mmmm, ( 0)
6: E( ) W( )
7: , ,Knots
8: ,
9:UTC ,DDMMYY
10: ,(000 - 180) ( 0)
11: ,E= W=
16:
ここで、「」はチェックサム識別子であり、その後ろの2桁はチェックサムであり、「$」と「」の間のすべての文字(この2つの文字を含まない)の異種値を表す16進数値である.上記の例文のチェックサムは16進数の50、すなわち10進数の80である.
ヒント:^演算子の役割は異或です.$と間のすべての文字を^演算(最初の文字と2番目の文字が異なっているか、結果が3番目の文字と異なっているか、このように推定されます)した後の値は65536に残りを取った結果、後の2つの16進数の値と等しいはずです.そうしないと、この文が転送中にエラーが発生したことを示します.この16進数値にはA-Fの大文字が表示されます.
今、あなたのプログラムは一連のGPS出力を読み込みます.$GPRMCも含まれています.他の文も含まれています.データの最後に、1行ずつ
END
データの終了を表します.
あなたのプログラムはそこからGPRMC文を探し出して、計算して検査して、その中の検査が正しいことを探し出して、しかもフィールド2はすでに位置した文を表して、そこから時間を計算して、北京時間に換算します.一度のデータには複数のGPRMC文が含まれ、最後の文で得られた北京時間を結果として出力します.
あなたのプログラムは必ず有効な$GPRMC文を読みます.
入力形式:
複数のGPS文があり、それぞれが折り返し改行で終わる.最後の行はENDの3つの大文字です.
出力フォーマット:
6桁の時間.
hh:mm:ss
このうち、hhは2桁の時間で、2桁未満の場合は前に0を補う.mmは2桁の分で、2桁未満の場合は前に0を補う.ssは2桁の秒で、2桁未満の場合は前に0を補う.
サンプルを入力:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
END
出力サンプル:
10:48:13
時間制限:500 msメモリ制限:32000 kb
#include
#include
//#include
//#include
#define GPS_ARRAY_SIZE 1000
void gps(char str[], int times[]);
int main(int argc, const char * argv[]) {
// insert code here...
// TODO Auto-generated method stub
char word[GPS_ARRAY_SIZE];
int times[3]={0};
char end[]="END";
do
{
scanf("%s",word);
gps(word,times);
}while(strcmp(word,end)!=0);
printf("%02d:%02d:%02d
",times[0],times[1],times[2]);
return 0;
}
/*GPS
str[] GPS ,times[] 3,
*/
void gps(char str[], int times[]){
int i;
if(str[0]=='$'&&str[1]=='G'&&str[2]=='P'&&str[3]=='R'&&str[4]=='M'&&str[5]=='C'&&str[6]!='\0'){
// $ *
int sum = 0; //
for(i=1; str[i]!='*'; i++){
sum = sum ^ str[i];
}
// *
char c1=str[i+1], c2=str[i+2];
//int1,int2 ,mask int1,int2 10
int int1, int2, mask;
if(c1 >='A' && c1<='F'){
int1 = 10+(c1-'A');
}else{
int1 = c1 - '0';
}
if(c2 >='A' && c2<='F'){
int2 = 10+(c2-'A');
}else{
int2 = c2 - '0';
}
mask = int1*16 + int2; //16 10
//
for(i=7; str[i]!='*'; i++){ //
if(str[i]==',')break;
}
if(str[i+1]=='A'&&mask==sum){
int hour = 10*(str[7]-'0') + (str[8]-'0'); //
hour = (hour + 8) % 24;
times[0] = hour;
times[1] = 10 * (str[9] - '0') + (str[10] - '0'); //
times[2] = 10 * (str[11] - '0') + (str[12] - '0'); //
}
}
}