2013-11-01 33 views
0

我们无法弄清楚如何将GPS连接到卫星。目前我们正在使用TinyGPS库。 Arduino发送信号,但没有收到卫星本身的任何响应。任何意见或帮助,将不胜感激。使GPS模块工作

使用:

Arduino的乌诺 的XBee亲屏蔽 的XBee GPS蜂

Arduino的代码:

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

/* This sample code demonstrates the normal use of a TinyGPS object. 
    It requires the use of SoftwareSerial, and assumes that you have a 
    4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx). 
*/ 

TinyGPS gps; 
SoftwareSerial ss(1, 0); 

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); 

    Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version()); 
    Serial.println("by Mikal Hart"); 
    Serial.println(); 
    Serial.println("Sats HDOP Latitude Longitude Fix Date  Time  Date Alt  Course Speed Card Distance Course Card Chars Sentences Checksum"); 
    Serial.println("   (deg)  (deg)  Age      Age (m) ---   from GPS ---- ---- to London ---- RX RX  Fail"); 
    Serial.println("-------------------------------------------------------------------------------------------------------------------------------------"); 

    ss.begin(9600); 
} 

void loop() 
{ 
    float flat, flon; 
    unsigned long age, date, time, chars = 0; 
    unsigned short sentences = 0, failed = 0; 
    static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002; 

    print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5); 
    print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5); 
    gps.f_get_position(&flat, &flon, &age); 
    print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6); 
    print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6); 
    print_int(age, TinyGPS::GPS_INVALID_AGE, 5); 
    print_date(gps); 
    print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2); 
    print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2); 
    print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2); 
    print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " :  TinyGPS::cardinal(gps.f_course()), 6); 
    print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON)/1000, 0xFFFFFFFF, 9); 
    print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2); 
    print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6); 

    gps.stats(&chars, &sentences, &failed); 
    print_int(chars, 0xFFFFFFFF, 6); 
    print_int(sentences, 0xFFFFFFFF, 10); 
    print_int(failed, 0xFFFFFFFF, 9); 
    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_date(TinyGPS &gps) 
{ 
    int year; 
    byte month, day, hour, minute, second, hundredths; 
    unsigned long age; 
    gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age); 
    if (age == TinyGPS::GPS_INVALID_AGE) 
    Serial.print("********** ******** "); 
    else 
    { 
    char sz[32]; 
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ", 
     month, day, year, hour, minute, second); 
    Serial.print(sz); 
    } 
    print_int(age, TinyGPS::GPS_INVALID_AGE, 5); 
     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); 
    } 
+0

你确定'SoftwareSerial'引脚('/ * ...引脚4(rx)和3(tx)* /'与'ss(1,0)')吗?另外,你能确定你在1000毫秒窗口内收到了很好的NMEA句子吗? –

回答

0
  1. 确保连接到D0(TX线),以及GPS模块(D1 RX线)。
  2. 检查串口的GPS模块默认设置。可能您应该尝试ss.begin(4800);或其他默认连接速度。
  3. 确保smartdelay代码至少执行一次(将调试字符串放在那里)。可能你在loop()函数中有未处理的异常,这会阻止从GPS模块读取任何数据。