Jakoś nie jestem zawsze zbyt dobry w takich sprawach, gdy są jakieś dane w jakimś formacie i trzeba wyłuskać coś z nich, w tym przypadku chcę wyłuskać tylko długość i szerokość geograficzną, zapisać ją w stringu z dokładnością do 6 miejsca po przecinku, no i to później wysyłam przez Bluetooth.
Ogólnie realizuję to na Arduino i co każdy takt do char'a zapisuje się po jednym znaku, więc to nie jest tak, że w jednym takcie sczytuję cały ten pakiet danych tylko w kilkudziesięciu. To są dane, które otrzymuje:
$GPRMC,105106.00,A,5238.01851,N,01726.07021,E,0.197,,181117,,,A*74
$GPVTG,,T,,M,0.197,N,0.364,K,A*2D
$GPGGA,105106.00,5238.01851,N,01726.07021,E,1,05,3.18,78.9,M,37.4,M,,*61
$GPGSA,A,3,22,14,31,01,03,,,,,,,,6.34,3.18,5.49*04
$GPGSV,3,1,11,01,67,160,32,03,70,272,34,04,,,18,12,,,25*70
$GPGSV,3,2,11,14,36,054,32,16,,,27,19,,,18,22,85,082,32*7D
$GPGSV,3,3,11,23,,,36,31,28,092,39,32,,,29*4E
$GPGLL,5237.85485,N,01725.59137,E,114456.00,A,A*65
Stwierdziłem, że najłatwiej będzie mi wyłuskać ostatnią linijkę, bo ma dwa charakterystyczne "LL", które nigdzie indziej nie występują, więc sobie zrobiłem taki kod:
char c;
String read_line;
if (gpsPort.available())
{
c=gpsPort.read();
if( c == 'L') pos++;
if( c == '$') {
pos=0;
Serial.print(read_line);
read_line="";
}
Serial.write(c); //wyświetlanie
if(pos==2) {
wyslany+=(char)c;
}
}
Czyli, jak rozpozna, że było 2xL to zapisuje po znaku do stringa read_line i kończy zapisywanie przy pojawieniu się $. Dzięki temu teraz w tym stringu otrzymuję taką linijkę:
L,5237.85485,N,01725.59137,E,114456.00,A,A*65
Znacie teraz może jakiś sposób już bez if'ów, żeby łatwo wydostać z tego 5237.85485 oraz 1725.59137 tak żeby to było w dwóch osobnych stringach w formie 52.3785485 oraz 17.2559137 ? Bo jakbym to robił po stronie aplikacji Android to bym skorzystał z indexOf i substringów, a tu nie wiem jak.
I wiecie może czy jest jakiś sposób, żeby sczytać te dane jakoś w jednej chwili od razu/w jednym takcie? Ale skoro to transmisja szeregowa, to raczej się nie da.