1

シリアルGPSからNMEAセンテンスを取得しています。それから私が期待するように文字列が出くわします。問題は、次のような文を解析する場合です。

$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A

簡単なコードを使用して、正しいセンテクトがあることを確認します。

        string[] Words = sBuffer.Split(',');
        foreach (string item in Words)
        {
            if (item == "$GPRMC")
            {
                return "Correct Sentence";
            }
            else
            {
                return "Incorrect Sentence
            }
        }

例として、その場所に返品を追加しました。分割結果をテキストボックスに出力しましたが、ある時点で$GPRMCが実際にitem変数で検出されていることがわかりました。文字列が検出された場合、ifステートメントがキャッチされないのはなぜですか?$ですか?どうすればこれをトラブルシューティングできますか?

4

3 に答える 3

2

NMEA GPSを読んでからしばらく経ちました...

NMEA バッファ要素全体ではなく、NMEA データ型に対応する部分文字列を比較する必要はありませんか? .Split メソッドは、NMEA センテンスのすべてのコンマで sBuffer を分割して、個々の要素を取得します。ただし、ループ内の最初の要素に対して部分文字列をテストしているため、すべての要素を確認する必要があります。紛らわしい...

したがって、あなたのテストは次のように良く見えません:

string[] Words=sBuffer.Split(',');
if(String.Compare(Words[0],"$GPRMC")==0) 
            {
                return "Correct Sentence";
            }
            else
            {
                return "Incorrect Sentence
            }

NMEA ストリームが Min Data、GPRMC センテンス以外のセンテンスを出力していて、正しいセンテンスになるまで読み直す必要がある可能性はありますか? また、GPS のデータ型が$GPRMCではなく であると確信していますGPRMCか? $データ型に a があるとは思わない。

つまり、疑似で:

do {
  buffer=read_NMEA();  //making sure the entire sentence is read...
  array=split(buffer,",");
  data_type=buffer[0];
}
while(data_type!="GPRMC" || readcount++<=MAX_NMEA_READS)

ループをデバッグするには、要素のコンソール書き込みを試してください。

string[] Words = sBuffer.Split(',');
        foreach (string item in Words)
        {
            Console.WriteLine(item);
        }
于 2010-04-18T19:38:30.330 に答える
1

チェックサムを計算していますか、わかりません。

NMEAウィキ

于 2010-04-18T19:39:10.737 に答える
0

編集:コメンテーターmtrwが述べたように、下の私の答えは改善されていません、==は文字列クラスによってオーバーロードされています。私は間違っていた。

私の考えでは、あなたのif-ステートメントは誤りです。演算子を使用して、==それが同じ参照であるかどうかを確認しています(これは確かに当てはまりません)。2つの文字列に同じ値が含まれているかどうかを単純に比較するには、を使用しますString.Equals()

于 2010-05-26T08:31:54.117 に答える