• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Komunikacja Arduino >> SIM 808
#1
Czołem Panowie!
Próbuję ogarnąć komunikacje Arduino z SIM808. Biblioteka TiniGPS++ nie do końca się sprawdza i próbuję coś sam stworzyć ale poległem na wszystkich frontach…
Do komunikacji używam biblioteki Software.serial.

Wysyłam zapytanie za pomocą komendy AT ( AT+CGPSINF=0) do modułu który zwraca mi komunikat:

<mode>,<longitude>,<latitude>,<altitude>,<UTS time>,<TTFF>,<num>,<speed>,<course>

Czyli ok! Wszystkie dane mam.

Natomiast tutaj już wymiękam bo:

Nie mam pojęcia jak zrobić by bezpośrednio zaraz po wysłaniu komendy AT odpowiedz została zapisana do jakiejś zmiennej (np. char dane[90]).

Próbowałem coś takiego ale bez rezultatu:

while (ss.available() > 0)
 {
char tab [90] = (char)ss.read();
 }

Wyrzuca błąd kompilacji. A kiedy zmienię z tablicy charów na zwykły String... to jest minimalnie lepiej... zapisuje dwie jakieś cyfry do tego stringu...

I kolejna zagwozdka... Jak odczytać z tablicy char’ów np. znaki z pozycji od 10 do 15 i wstawić je do jednego np. float’a? Czy można wstawić ifa który będzie sprawdzał że jeśli w tablicy jest '' , '' to zapisz wszystkie następne pięć znaków do zmiennej float?

Wiem że problem trochę złożony ale tylu ekspertów w jednym miejscu to tylko na elektrodzie jest Tongue
 
Odpowiedź
#2
Witam.
W przykładach komunikacji jest SerialEvent.
Odbiór polega na:
1. Stworzenie bufora na nadlatujące literki
2. W zdarzeniu nadlatującego znaku dodawanie ich do bufora
3. Jak system wykryje znak nowej linii przekazuje informację "stringComplete", kopiujesz szybko bufor bo tam mogą lecieć już nowe znaki (istotne  gdy maszyny ze sobą gadają, chyba, że wiesz, że po linii jest kilka ms ciszy).
4. Robisz ze stringiem co chcesz w pętli głównej lub w wybranej funkcji.
Generalnie programiści zalecają zrobienie zamiast string bufora w postaci tablicy znaków char. Wadą jest to że rezerwujesz wielkość zmiennej na stale, zaletą też. Dla string pamięć jest rezerwowana dynamicznie, nie zawsze zwracana, coś tam się przepełnia, niebieski ekran, koniec zabawy.
Jak masz string to dzielisz go na substring, jeśli używasz tablicy literek to używasz do podziału np. strtok(), char* pierwszy=strtok(kopiabuforu,",");  i dopóki w kopi bufora (lepiej bawić się na kopii) nie trafisz na zero kończące tablicę char* kolejny=strtok(NULL,","). Po tej operacji masz w zmiennej "pierwszy" mode, a w "kolejnej" longtitude, itd. jako literki. Oczywiście jak sobie słowa rozdzielasz dwukropkiem to jako znak sterujący używasz ":" zamiast ",". Sprawdzasz czy znaki to cyfry, jeśli tak to znak  zamieniasz na cyfrę i przypisujesz do zmiennej int, sprawdzasz kolejny, jak znowu cyfra to poprzednia wartość x10 i dodajesz nową cyfrę, itd. (funkcja atoi()). Jak nie jest to rakieta zdalnie sterowana to ta funkcja zamieni cały napis w liczbę int. O ile nikt nie trzyma magnum przy głowie to nie używasz float. Jeśli potrzebujesz mieć 2 znaki po przecinku to lepiej jak sobie operujesz na liczbach x100 ale możesz je sobie porównywać ze sobą i zachowują się racjonalnie. Float zachowują się dziwnie, działają wolno, zajmują więcej flash. 
To tak w skrócie - miłej zabawy.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości