2016-10-23 9 views
0

ArduinoでTinyGPS++を使用してNMEAデータを解析し、OLEDディスプレイに情報を表示したいと考えています。しかし、ソフトウェアシリアルとTX/RXピンを使用する代わりに、NMEAデータはUSBによって受信されます。シリアルからNMEA文を解析する

私はTinyGPS ++から例を追ったが、私は二つの問題が発生しました:

1) 私はシリアルモニター(Windowsの上で1つのNMEA文を送信するときにのみ、最初の64の文字は、Arduinoのによって受信され、 Arduino 1.6.9)。どうすればこの制限を克服できますか?私は小数点以下2桁を削除することで自分自身を助けますが、これは好ましい方法ではありません。

2)TinyGPS ++ BasicExampleで サンプルNMEA文字列は、読み出し専用メモリ内に定義されています。私は私のNMEAを受ける

while (*gpsStream) { 
    Serial.print(*gpsStream); 
    gps.encode(*gpsStream++); 
} 

によって

// A sample NMEA stream. 
const char *gpsStream = 
    "$GPRMC,045103.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7C\r\n" 
    "$GPGGA,045104.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*62\r\n" 
    "$GPRMC,045200.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*77\r\n" 
    "$GPGGA,045201.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6C\r\n" 
    "$GPRMC,045251.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7D\r\n" 
    "$GPGGA,045252.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6F\r\n"; 

と解析された(残念ながらのみ1行)この方法:

if (Serial.available()) { 
    while (Serial.available() > 0) { 
    if(index < 80) 
    { 
     inChar = Serial.read(); 
     inData[index] = inChar; 
     index++; 
     inData[index] = '\0'; 
    } 
    } 
} 

とによってそれを解析しよう:

index = 0; 
while (index < 80) { 
    gps.encode(inData[index]); 
    Serial.print(inData[index]); 
    index++; 
} 

しかし、必要に応じて、これは動作しません。場所isValid()が常に真ではないかどうかをチェックします。

残念ながら、私はこの望ましくない動作の原因をいくつか考えています。

  1. シリアル経由でデータを読み取るあまりに短い文章(そう)
  2. 誤った道。
  3. 私は1行だけを提出します。
  4. 他にもあります。

私はNMEAもシリアルデータ通信も経験していません。私はArduino/Cの経験はほとんどありません。この(これらの)問題を解決する方法を私に指示できますか?

+0

#1は[このバグ](https://github.com/arduino/Arduino/issues/1223)に起因すると思います。私の勘違いは、これがPC上で円滑になるということです。あなたはシリアルドングルをコンピュータに接続し、そこに初期の開発者を置いて、次にarduinoの特定の問題を2番目に解決してみませんか? –

+0

あなたの受信ループと解析ループも私には間違っていますが、[MCVE](http://stackoverflow.com/help/mcve)なしでは言い難いです –

+0

シリアルドングルの意味を理解できません。後でGPSデバイスが追加されます。今のところ私はPCを介してArduinoに送信するいくつかの文章を持っています。私はそれが単にラインの終わりではなく特定の位置でマッサージを切るので、キャリッジリターンによるとは思わない。しかし、私はそれを見てMCVEを提供します – Markus

答えて

0

基本的に、NMEA文字を蓄積する必要はありません。あなたがそれらを受け取ると、それらをGPSライブラリに供給するだけです。ループ全体を提供するわけではありませんが、そこに問題があることは非常に一般的です。

いくつかのGPSライブラリとそれらの例で苦労した結果、私はついにNeoGPSと書いた。それは他のすべてのライブラリより速くて小さく、チェックサムを検証し、サンプルが正しく構造化されています。他のライブラリとは異なり、NeoGPSはGPS値を浮動小数点値として保存しないため、GPSデバイスの完全な精度を維持することができます。

試してみるには、インストール手順に必ず従ってください。 NMEA.inoの例では、送信するGPS文のバッチごとに1行の情報(CSV形式)を出力し、デフォルトのRMC文で終了します。また、良い文章が受信されたどのように多く、解析されている文字の数が表示されます

#define gps_port Serial 

、および:その方法を代わりにgps_portSerialオブジェクトを使用する、または単にそれを定義するためにそれを変更してくださいチェックサムエラーがいくつあったか。これは、チェックサムを正しく生成していない場合、デバッグに役立ちます。 This siteも便利です。

これらのCSVラインはUSBポート(PC)に戻されますが、簡単に変更して特定のフィールドをOLEDに送信できます(NMEAloc.ino参照)。

でも可能ですが、PC上で何かを開発してArduinoのような組み込み環境に移植するには、(1)線形プログラム構造と(2)リソース制限(プログラムサイズ、MCUの速度とRAM)。 Arduino環境には、PCとの間で「スケッチ」を移植することに苛立ちを感じる多くの欠点があります。      :P

+0

ねえ、ありがとう!私はそれを調べます。しかし、時間がかかるかもしれません。私はあなたを更新し続けます。 – Markus

関連する問題