2014-12-29 5 views
1

У меня возникли проблемы с использованием библиотеки TinyGPS для разбора Lat и Lon. Является ли эта библиотека совместимой с RFduino? Я могу читать строки NMEA, загружая пустой эскиз в RFduino, а затем просто открывая Serial Monitor, поэтому я знаю, что данные GPS проходят через последовательный порт, но когда я пытаюсь получить Lat или Lon в переменную, заполняет переменную 999999999. Я отправляю эти данные через BLE на андроид. Если я не пытаюсь получить данные GPS, я могу отправить любое значение, которое я хочу в переменных lat или lon, и оно появляется в моем пользовательском приложении для Android. Я где-то читал, что softserial library не работает на rfduino. Это правда? Если нет, я смогу распечатать свои данные через жесткий последовательный порт, упростив устранение неполадок. Ниже я прикрепил код, который я использую в своем RFduino. Любой совет будет принят во внимание.RFduino не вытягивает строки NMEA из GPS

//  CODE   // 

#include <RFduinoBLE.h> 
#include <TinyGPS.h> 


TinyGPS gps; 

long lat = 5; //Load lat/lon with junk value for testing 
long lon = 6; 
char latBuf[20]; 
char lonBuf[20]; 

void setup() { 
    // this is the data we want to appear in the advertisement 
    // (if the deviceName and advertisementData are too long to fix into the 31 byte 
    // ble advertisement packet, then the advertisementData is truncated first down to 
    // a single byte, then it will truncate the deviceName) 
    RFduinoBLE.advertisementData = "ledbtn"; 

    // start the BLE stack 
    RFduinoBLE.begin(); 
    Serial.begin(9600);//For GPS Communication 
} 



void loop(){ 
    char c = byte(Serial.read()); 
    gps.encode(c); 
    gps.get_position(&lat,&lon); // get latitude and longitude 
    // send position as char[] 

    String latString = String(lat); 
    String lonString = String(lon); 

    latString.toCharArray(latBuf, 20); 
    lonString.toCharArray(lonBuf, 20);  
    RFduinoBLE.send(lonBuf, 20); 
    } 


void RFduinoBLE_onDisconnect() 
{ 
} 

void RFduinoBLE_onReceive(char *data, int len) 
{ 
    RFduinoBLE.send(lonBuf, 20); 
} 
+0

Как вам удалось использовать gps-модуль с rfduino и какой? – quape

+0

Я использовал этот модуль. http://www.adafruit.com/products/790 – user1359770

ответ

1

Одна проблема, которую я вижу: loop() пытается считывать координаты GPS каждый раз, когда выполняется цикл. Этот подход имеет две проблемы: 1) цикл не дожидается, пока не будут получены последовательные данные, и 2) цикл не дожидается, пока данные GPS не будут действительны.

От чтения http://arduino.cc/en/Tutorial/ReadASCIIString и http://arduiniana.org/libraries/tinygps/ я рекомендую переписывание петли() на что-то вроде этого:

loop() { 
    char c; 
    float fLat, fLon; 
    unsigned long fix_age; 
    static unsigned long previous_fix_age = 0; 

    // If nothing to read; do nothing. 
    // Read as many characters as are available. 
    while (Serial.available() > 0) { 

    // Tell the GPS library about the new character. 
    c = Serial.read(); 
    gps.encode(c); 

    gps.f_get_position(&flat, &flon, &fix_age); 
    if (fix_age != TinyGPS::GPS_INVALID_AGE && fix_age != previous_fix_age) { 
     // new GPS data is valid, new, and ready to be printed 

     previous_fix_age = fix_age; // remember that we've reported this data. 

     String latString = String(lat); 
     ...the rest of the code you already have to print the lat and lon. 
    } 

    } 
} 

Кода о previous_fix_age есть так, что печатает цикл координат только тогда, когда новое исправление было получено от GPS ,

+0

Я сделал эти изменения, и это сработало! Благодарю. – user1359770

 Смежные вопросы

  • Нет связанных вопросов^_^