Jak zbudować (połączyć) ciąg z dużymi liczbami

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

  • Aren ' t brakuje średnika?
  • a jeden mówi vnnt, podczas gdy inny mówi vannut
  • Przepraszamy za literówkę ' s 🙂
  • Czy znasz typ danych GPS.latitude? Na przykład. czy to float, int itd.?
  • Myślę, że ' jest float? W komunikacie o błędzie jest napisane float. Jak mogę się dowiedzieć? Czy istnieje var_dump czy coś?

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).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *