- ベストアンサー
C++でGPSから時刻が表示されない
VisualStudio2010のC++でGPSからGGAセンテンスを読み取り時刻と経度・緯度を表示するプログラムを書いています。しかし、正常にビルドされるものの、画面に正しく表示されません。以下にコードを記すのでどこが悪いのかご指摘いただきたく思います。コードの中身は下記のリンクにあるzipファイルからお願いします。 さらにgoogleマップへの表示方法もご教授いただきたく思います。 https://skydrive.live.com/redir?resid=9A0EE6F5F21061CB!105&authkey=!AJvuCjD7u6qdJbE
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
1行読み込めたら、解析処理に放り込む…って感じでしょうか。 BOOL TransGGA(unsigned char *Recv) { BOOLl Result = FALSE; if(Recv && strncmp(Recv, "$GPGGA,", strlen("$GPGGA,")) == 0) { unsigned char SumCalc; unsigned char *SumPt; for(SumPt = Recv, SumCalc = *SumPt;*SumPt && *SumPt != (unsigned char)'*';SumPt++, SumCalc += *SumPt); if(*SumPt && SumCalc == (unsigned char)strtol(SumPt, NULL, 16)) { /* strtok()などで','で区切って解析。 */ /* 正しく解析できたらResult = TRUE; */ } } return Result; } とりあえず、こんなトコですかねぇ……。 動作は未確認。というかGPSのデータ送信してくれる機器無いですし。 # GPS内蔵機器はいくつかありますがWindowsにシリアル接続でデータ渡せないし。 先頭の特定文字があるかどうかを判定して、チェックサムの算出&判定してます。 その後の','で区切って…ってのはCSV解析とかでよく出てくる例ですから、 検索するとそれらしいモノは見つかるでしょう。 トークン区切りできたら、$GPGGA formatの仕様に沿って変換したりとか……。 # strtok()だと、元の文字列破壊したかと思いますので、その辺りはよろしく処理してください。
その他の回答 (2)
- Wr5
- ベストアンサー率53% (2173/4061)
>ちなみにTransGGA()でのフォーマット解析処理はどのようにするとよいでしょうか? まあ、いろいろな方法がありますが…… 私なら、とりあえず1行読み込んでから、','で区切って、最初のフィールドが "$GPGGA"か判定、その後は','で区切りながら各フィールドを取得していく……でしょうね。 まぁ先にchecksumの確認するかも知れませんけど。 # checksumの算出方法調べる必要はあるかも知れませんけどねぇ……。 # 行の先頭から'*'の位置までの合計(下位8Bit)…かな?
お礼
回答ありがとうございます。 色々試しているのですがなぜかうまくいかないんですよね・・・ なにか具体的なコードかなにかありますでしょうか?
- Wr5
- ベストアンサー率53% (2173/4061)
ざっとしか見ていませんが…… >どこが悪いのかご指摘いただきたく思います。 ReadFile()の戻り値を確認していないようですが…… 読み込み失敗とか考慮していますか? 1バイト読み込む度に、その後のstrcmp()など実行していますが、 コストが掛かりすぎる。とは思いませんか? 1行読み込みしてから処理するようにした方がいいかと思いますが……。 TransGGA()でのGPGGA formatの解析処理が…正しくない様に見えます。 http://ssro.ee.uec.ac.jp/ssro/uchuu-tsuushin/gps/GPS-data-format.html 1行取得完了後に、それぞれのフィールドを分解して解析すべきかと。
お礼
早速の回答ありがごうとざいます。初心者なもので読み込み失敗などはまったく考慮していないです・・・・ ちなみにTransGGA()でのフォーマット解析処理はどのようにするとよいでしょうか?
お礼
お礼が遅くなってしまって申し訳ないです。提示していただいた方法で現在やっているところです。早々のご回答ありがとうございました。