Nowy w arduino Mam problem z czymś, co wygląda na dość n00b … Byłem podłączony podłączam adafruitową kartę GPS do mojego Arduino i działa, wypluwając dane GPS do portu szeregowego za pomocą Serial.print(GPS.latitude, DEC)
Teraz chcę połączyć ciąg które mogę przetworzyć (czytaj: Chcę to wysłać przez klienta sieci Ethernet). Oto, co już mam:
...... String vnnt = "$VNNT,"; if (GPS.fix) { vnnt += "GPS,"; //this works: vnnt.concat(GPS.fix); //but this not: vnnt.concat(GPS.latitude); }else{ vnnt += "INFO,Acquiring Sats"; } Serial.println(vnnt);
Komunikat o błędzie to: Call of overloaded "concat(float&)" is ambiguous
Kiedy Serial.print(GPS.latitude, DEC)
skutkuje: 4418.5937996050
Więc to jest prawdopodobnie za duży lub coś w tym rodzaju …
Jak mogę połączyć zmienne i utworzyć długi ciąg?
Komentarze
Odpowiedź
Funkcja concat nie implementuje wersji float, ale niektóre of char, int, unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
więc kompilator nie wie, jak rzutować (prawdopodobnie skracając liczbę zmiennoprzecinkową) na liczbę całkowitą, ponieważ istnieje kilka opcje.
Najpierw musisz przekonwertować zmiennoprzecinkowy na łańcuch, użyć dtostrf () lub sprintf (), a następnie połączyć z ciągiem.
char outstr[25]; sprintf(outstr, "%f", GPS.latitude);
lub
dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs
A potem:
vnnt.concat(outstr)
Pamiętaj też, że sprintf jest bardzo przydatny w kompaktowe tworzenie (znakowego) ciągu znaków:
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
Komentarze
- +1 w razie wątpliwości,
sprintf
to już 🙂 - Jedna uwaga:
sprintf()
to funkcja złożona, stąd raczej powolny i zajmuje sporo pamięci. Generalnie unikałbym tego dla kodu " produkcyjnego " (zachowaj tylko do celów debugowania). - To jest dobra uwaga @jfpoilpret, nie brałem pod uwagę. Czy masz jakiś rząd wielkości wydajności w porównaniu z wersją dtostrf + concat? Czy to samo dotyczy sscanf ()? (btw, teraz wątpię, czy sscanf () faktycznie działa dobrze w arduino)
- Nie wykonałem rzeczywistych pomiarów, aby porównać oba wywołania, ale wydaje mi się, że można po prostu spojrzeć na kod C i ewentualnie sprawdzić wygenerowany zespół. Jeśli chodzi o
sscanf
, IIRC ma pewne ograniczenia (myślę, że z liczbami zmiennoprzecinkowymi).
vnnt
, podczas gdy inny mówivannut
GPS.latitude
? Na przykład. czy tofloat
,int
itd.?