2

これが何度も尋ねられたことは知っていますが、本当に探しているものが見つかりません。

Arduino Uno と、GPS データをシリアルで表示する GPS Shield を使用しています。

GPS Shield に接続するために Arduino にアップロードするコードは次のとおりです。

void loop() // run over and over
{
    while(!(mySerial.available())){}
      Serial.write(mySerial.read());
}

それだけのコードです。それにもかかわらず、連続的にループするため、シリアル モニターでは、GPS データも毎秒出力されます。

毎秒の出力は次のとおりです。

$GPGGA,013856.000,000.9090,N,9090.90,E,1,09,1.1,316.97,M,0.00,M,,*66
$GPGSA,A,3,07,08,11,1ÿ3,16,19,23,27,42,,,,2.8,1.1,2.5*3F
$GPRMC,013856.000,A,000.9090,N,9090.90,E,0.0,038.1,310814,,,A*62
$GPGSV,ÿ3,1,12,16,26,059,33,27,33,025,44,08,30,330,32,07,31,326,34*7A
$GPGSV,3,2,12,19,58,354,31,01,33,186,18,23,32,221,24,11,5ÿ9,198,31*70
$GPGSV,3,3,12,42,60,129,32,13,38,253,27,32,06,161,,31,01,140,*7E

毎秒更新されるため、座標が最小限に変わります。これは、GPS シールドが機能していることを意味します。

ここでの問題は、特に GPGGA 行のみで GPS データを解析し、他の行を無視したかったことです。ステータス、緯度、N/S インジケータ、経度、および E/W インジケータを解析したいと思います。

NMEA ライブラリ ( http://nmea.sourceforge.net/ )を検索しましたが、使い方がわかりません。

誰かがここで私を助けてくれますか? ありがとうございました。

4

5 に答える 5

1

私はインターネットを検索しましたが、最良の答えはArduino用の「TinyGPS++」ライブラリを使用することです。ライブラリには、ほとんどすべての GPS 関連コードが既に含まれています。

于 2014-09-06T00:15:51.717 に答える
0

あなたを助けることができるこれを試してください

#include <SoftwareSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
SoftwareSerial ss(3,4);


static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
  Serial.begin(9600);
  ss.begin(9600);
}

void loop()
{
  float flat, flon;

  unsigned short sentences = 0, failed = 0;

  gps.f_get_position(&flat, &flon);
  Serial.print("LATITUDE: ");
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  Serial.println(" ");
  Serial.print("LONGITUDE: "); 
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  Serial.println(" ");

  Serial.print("altitude: ");
  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
  Serial.println(" ");
  Serial.print("COURSE:");
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  Serial.println("");

  Serial.print("DIRECTION: ");
  int d;
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  d=gps.f_course(); 
  Serial.println();
  Serial.println();
  smartdelay(1000);    

}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  smartdelay(0);
}
static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartdelay(0);
}
于 2016-01-27T09:11:05.723 に答える