質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

Q&A

解決済

2回答

1927閲覧

NMEAパーサーを作りたい

suzumushi

総合スコア4

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

0グッド

0クリップ

投稿2020/11/01 00:45

実現したいこと

現在c++を用いてGPS受信機から受信したNMEAフォーマットを文字列から数値に変換するプログラムを作成しています。
これをヘッダファイルやクラスを用いてすっきりとした形で実現したいと考えています。

現在の問題

現在は受信機から1文字ずつデータを受信して$マークを受け取ったら次の5文字を読み込んでGPVTGなりGPRMCなりを分類し、その後カンマを受信した回数を数えて緯度や経度の情報を取得しています。
ただ、これでは処理が煩雑になりすぎている気がするのですが、これしか方法はないのでしょうか?

ご回答のほどよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/11/01 00:59

処理が煩雑になりすぎているという、そのコードみせて。
guest

回答2

0

これでは処理が煩雑になりすぎている気がする

気のせいです。

現在は受信機から1文字ずつデータを受信して$マークを受け取ったら次の5文字を読み込んでGPVTGなりGPRMCなりを分類し、その後カンマを受信した回数を数えて緯度や経度の情報を取得しています。

これしか方法はないのでしょうか?

本質的に違うというほどではないですけれど、

一文字受信する毎に処理するのではなく、改行コードまでの一行分をバッファに溜め込んで、その一行分のデータについてチェックサムを確認して、正当であれば行のデータから情報を切り出すように処理する、というやり方をするケースのほうが多いとは思います。

投稿2020/11/01 05:19

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これでは処理が煩雑になりすぎている気がするのですが、これしか方法はないのでしょうか?

いや、いうほど煩雑じゃないのでは?

$ , * を区切り文字とし、区切り文字の左と右に切り分けるサンプル↓

C++

1#include <string> 2#include <iostream> 3#include <iomanip> 4 5int main(){ 6 std::string input = "$GPRMC,085120.307,A,3541.1493,N,13945.3994,E,000.0,240.3,181211,,,A*6A"; 7 8 std::string::size_type pos; 9 while ( (pos = input.find_first_of("$,*")) != std::string::npos ) { 10 char delim = input[pos]; 11 std::string token = input.substr(0, pos); 12 input = input.substr(pos+1); 13 std::cout << std::setw(16) << ("[" + token + "] ") << delim << " [" << input << "]\n"; 14 } 15}

実行結果:

[] $ [GPRMC,085120.307,A,3541.1493,N,13945.3994,E,000.0,240.3,181211,,,A*6A] [GPRMC] , [085120.307,A,3541.1493,N,13945.3994,E,000.0,240.3,181211,,,A*6A] [085120.307] , [A,3541.1493,N,13945.3994,E,000.0,240.3,181211,,,A*6A] [A] , [3541.1493,N,13945.3994,E,000.0,240.3,181211,,,A*6A] [3541.1493] , [N,13945.3994,E,000.0,240.3,181211,,,A*6A] [N] , [13945.3994,E,000.0,240.3,181211,,,A*6A] [13945.3994] , [E,000.0,240.3,181211,,,A*6A] [E] , [000.0,240.3,181211,,,A*6A] [000.0] , [240.3,181211,,,A*6A] [240.3] , [181211,,,A*6A] [181211] , [,,A*6A] [] , [,A*6A] [] , [A*6A] [A] * [6A]

投稿2020/11/01 01:27

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問