非线性动态逆 发表于 2013-12-20 23:29:01

ublox GPS采用TinyGPS_UBX库无法工作的问题,谢谢

本人搞了个ubloxGPS,连接到arduino UNO板子上,红线接5v,黑线GND,绿线到2,黄线3。采用了TinyGPS_UBX库的EXAMPLE,可正常编译和load,可是怎么都只显示如下内容。请高手诊断。先谢过!
time: 198:96:72
latitude: 100.00000
longitude: 100.00000
altitude: -0 m
speed: 42949672.00 km/h
vert. speed: -1 cm/s
bearing: 99999
satellites: 99
has fix: 0
fix quality: 0
fix age: 4294967295
// TinyGPS test for uBlox GPS proprietary PUBX format
// tested on Arduino 0022 and 1.0.1
// x-f, 2012

#include <avr/pgmspace.h>

// latest (former NewSoftSerial), not the one supplied with Arduino 0022
// SoftwareSerial's buffer size must be increased in SoftwareSerial.h:
// #define _SS_MAX_RX_BUFF 128 // RX buffer size
#include <SoftwareSerial.h>
#include <TinyGPS_UBX.h>

SoftwareSerial GPS_Serial( 2,3);
TinyGPS gps;

#define DEBUG true

byte gps_hour, gps_minute, gps_second;
long gps_lat, gps_lon;
unsigned long gps_fix_age;


// no need to store these in the RAM anyway
static char str_buffer;
prog_char GPSstr_poll[] PROGMEM = "$PUBX,00*33";
prog_char GPSstr_setup1[] PROGMEM = "$PUBX,40,ZDA,0,0,0,0*44";
prog_char GPSstr_setup2[] PROGMEM = "$PUBX,40,GLL,0,0,0,0*5C";
prog_char GPSstr_setup3[] PROGMEM = "$PUBX,40,VTG,0,0,0,0*5E";
prog_char GPSstr_setup4[] PROGMEM = "$PUBX,40,GSV,0,0,0,0*59";
prog_char GPSstr_setup5[] PROGMEM = "$PUBX,40,GSA,0,0,0,0*4E";
prog_char GPSstr_setup6[] PROGMEM = "$PUBX,40,GGA,0,0,0,0*5A";
prog_char GPSstr_setup7[] PROGMEM = "$PUBX,40,RMC,0,0,0,0*47";
PROGMEM const char *str_table[] = {
GPSstr_poll, GPSstr_setup1, GPSstr_setup2, GPSstr_setup3,
GPSstr_setup4, GPSstr_setup5, GPSstr_setup6, GPSstr_setup7
};


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

GPS_setup();

// if you're using Arduino 1.0, you can have
// Serial.println(F("we are go!"));
// to print text strings from flash memory
Serial.println("we are go!");
}

void loop() {

GPS_poll();

gps.crack_time(&gps_hour, &gps_minute, &gps_second, &gps_fix_age);
gps.get_position(&gps_lat, &gps_lon, &gps_fix_age);

char time;
sprintf(time, "%02d:%02d:%02d", gps_hour, gps_minute, gps_second);

Serial.println();
Serial.print("time: "); Serial.println(time);
//Serial.print("latitude: "); Serial.println(gps_lat, DEC);
//Serial.print("longitude: "); Serial.println(gps_lon, DEC);
Serial.print("latitude: "); Serial.println(gps_lat/100000.0, 5);
Serial.print("longitude: "); Serial.println(gps_lon/100000.0, 5);
Serial.print("altitude: "); Serial.print(gps.altitude()/100.0, 0); Serial.println(" m");
//Serial.print("speed: "); Serial.print(gps.speed()/100.0, 0); Serial.println(" km/h");
Serial.print("speed: "); Serial.print(gps.f_speed_kmph(), 2); Serial.println(" km/h");
Serial.print("vert. speed: "); Serial.print(gps.vspeed(), DEC); Serial.println(" cm/s");
Serial.print("bearing: "); Serial.println(gps.course()/100, DEC);
Serial.print("satellites: "); Serial.println(gps.sats(), DEC);
Serial.print("has fix: "); Serial.println(gps.has_fix(), DEC);
Serial.print("fix quality: "); Serial.println(gps.fix_quality(), DEC);
Serial.print("fix age: "); Serial.println(gps_fix_age, DEC);
Serial.println("------------");

delay(5000);
}


void GPS_setup() {
GPS_Serial.begin(9600);
// switch baudrate to 4800 bps
//GPS_Serial.println("$PUBX,41,1,0007,0003,4800,0*13");
//GPS_Serial.begin(4800);
//GPS_Serial.flush();

delay(500);

// turn off all NMEA sentences for the uBlox GPS module
// ZDA, GLL, VTG, GSV, GSA, GGA, RMC
GPS_Serial.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table)));
GPS_Serial.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table)));
GPS_Serial.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table)));
GPS_Serial.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table)));
GPS_Serial.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table)));
GPS_Serial.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table)));
GPS_Serial.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table)));

delay(500);
}

// request uBlox to give fresh data
boolean GPS_poll() {
//GPS_Serial.println("$PUBX,00*33");
GPS_Serial.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table)));
delay(300);
unsigned long starttime = millis();
while (true) {
    if (GPS_Serial.available()) {
      char c = GPS_Serial.read();
      #if DEBUG
      Serial.print(c);
      #endif
      if (gps.encode(c))
      return true;
    }
    // that's it, can't wait any longer
    // i have short attention span..
    if (millis() - starttime > 1000) {
      #if DEBUG
      Serial.println("timeout");
      #endif
      break;
    }
}
return false;
}

i7456 发表于 2013-12-20 23:43:25

1. GPS在室内无法定位;要拿到户外开阔地,或窗户外,尽量没有楼遮挡信号;
2. 首次定位的时间要比较长,有点耐心;
3. 一定要GPS的tx接arduino的rx;GPS的rx接不接无所谓;如果不确定哪个是tx,哪个是rx。可以交换下接线。
4. GPS的波特率也可能会是4800;
5. 最好还是先把GPS接TTL转USB的模块,开串口调试助手看下GPS的输出信息。搞清楚那个线是GPS的TX,GPS的波特率是多少。

非线性动态逆 发表于 2013-12-20 23:50:20

i7456 发表于 2013-12-20 23:43 static/image/common/back.gif
1. GPS在室内无法定位;要拿到户外开阔地,或窗户外,尽量没有楼遮挡信号;
2. 首次定位的时间要比较长,有 ...

非常感谢你的回复。
我把gps放在窗外测试的,同样条件同一个GPS用ardupilot自驾仪是可以获得位置的,但是接到uno板子上就不行了。
rx tx我也确认过,反复了好几次了,还是不行啊。
波特率也改过,不行。
哎啊,不知怎么搞啊。

i7456 发表于 2013-12-21 00:00:17

非线性动态逆 发表于 2013-12-20 23:50 static/image/common/back.gif
非常感谢你的回复。
我把gps放在窗外测试的,同样条件同一个GPS用ardupilot自驾仪是可以获得位置的,但是 ...

换下IDE试试
// tested on Arduino 0022 and 1.0.1

非线性动态逆 发表于 2013-12-21 00:17:51

i7456 发表于 2013-12-21 00:00 static/image/common/back.gif
换下IDE试试
// tested on Arduino 0022 and 1.0.1

换了个1.01的,还是搞不定啊,崩溃。

拾瑞 发表于 2013-12-21 09:05:49

你先用UBLOX的测试软件看一下,该模块目前是什么数据格式吧。。。。。。。

非线性动态逆 发表于 2013-12-22 23:36:41

自己顶一下啊

笨笨123 发表于 2014-4-29 15:29:53

楼上的gps库哪儿来的,能不能分享一下。

沧海笑1122 发表于 2014-7-21 14:41:50

最近也在玩ublox的gps,看到这个帖子,不知道楼主解决了没有。
我顺利使用了这个库。
一。请注意代码中的这一段重要注释。
// latest (former NewSoftSerial), not the one supplied with Arduino 0022
// SoftwareSerial's buffer size must be increased in SoftwareSerial.h:
// #define _SS_MAX_RX_BUFF 128 // RX buffer size
这句话要求在SoftwareSerial.h里面,把原来的接受缓存从64改到128。

二。有玩家提醒注意RX,TX是对的,你可以交换倒一下。
三。冷淡上电后,有几分钟的启动时间,你别着急折腾,放着别动,等到模块上红灯闪(gps定位,我的模块是红灯)。

Andy20000729 发表于 2014-7-31 00:09:37

本帖最后由 Andy20000729 于 2014-7-31 11:23 编辑

我试了一下,同问题

Andy20000729 发表于 2014-7-31 11:32:08

这就是那个库

frankpian 发表于 2015-5-27 23:19:51

楼主你成功了么,我用别人的示例代码都没问题,用着个TinyGPS的库跟你是一样的问题。
我还测试了新的TinyGPSplus库,也不行

frankpian 发表于 2015-5-28 00:21:14

本帖最后由 frankpian 于 2015-5-28 00:22 编辑

刚刚用tinygps++库成功了,不知道为毛,我把软串口改成硬串口就成功了#include <TinyGPS++.h>

TinyGPSPlus gps;


void setup() {
Serial.begin(9600);
Serial1.begin(9600);

}

void loop() {
while (Serial1.available()>0)
if (gps.encode(Serial1.read()))
    displayInfo();

if (millis() > 5000 && gps.charsProcessed() < 10)
{
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
}
}

void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
}
else
{
    Serial.print(F("INVALID"));
}

Serial.print(F("Date/Time: "));
if (gps.date.isValid())
{
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
}
else
{
    Serial.print(F("INVALID"));
}

Serial.print(F(" "));
if (gps.time.isValid())
{
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
}
else
{
    Serial.print(F("INVALID"));
}

Serial.println();
}

yiizzT 发表于 2021-1-14 20:05:08

frankpian 发表于 2015-5-28 00:21
刚刚用tinygps++库成功了,不知道为毛,我把软串口改成硬串口就成功了

我是库一直是灰色的,但是上面又显示库在里面加载成功,是一个原因吗?
页: [1]
查看完整版本: ublox GPS采用TinyGPS_UBX库无法工作的问题,谢谢