Hoe een string met grote getallen te bouwen (concat)

nieuw voor arduino Ik worstel met wat klinkt als een redelijk n00b-probleem … ik heb bedraad een adafruit GPS-bord naar mijn Arduino en het werkt als het GPS-gegevens naar de seriële poort spuugt met Serial.print(GPS.latitude, DEC)

Ik wil nu een string samenvoegen die ik kan verwerken (lees: ik wil het via een ethernetclient verzenden.) Dit is wat ik al heb:

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

De foutmelding is: Call of overloaded "concat(float&)" is ambiguous Wanneer ik Serial.print(GPS.latitude, DEC) het resulteert in: 4418.5937996050

Dus het is waarschijnlijk te groot of zoiets …

Hoe kan ik de variabelen samenvoegen en de lange string maken?

Reacties

  • Is ' Mist u geen puntkomma?
  • en de een zegt vnnt terwijl een ander vannut
  • Sorry een typfout ' s 🙂
  • Kent u het datatype van GPS.latitude? Bijv. is het een float, int, enz.?
  • Ik denk dat het ' is een vlotter? Het zegt zweven in het foutbericht. Hoe kom ik erachter? Is er een var_dump of zoiets?

Answer

De concat-functie implementeert geen float-versie, maar sommige van char, int, unsigneds …

unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ... 

dus de compiler weet niet hoe hij moet casten (waarschijnlijk de float afkappen) naar integer, aangezien er verschillende zijn opties.

Je moet eerst je float converteren naar string, dtostrf () of sprintf () gebruiken en dan concat naar je string.

char outstr[25]; sprintf(outstr, "%f", GPS.latitude); 

of

dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs 

En dan:

vnnt.concat(outstr) 

Merk ook op dat sprintf erg handig is voor compacte creatie van een (char) string:

char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude); 

Reacties

  • +1 bij twijfel, sprintf it out 🙂
  • Een punt van voorzichtigheid echter: sprintf() is een complexe functie, daarom is het nogal traag en gebruikt behoorlijk wat geheugen. Over het algemeen zou ik het vermijden voor " productie " code (alleen bewaren voor foutopsporingsdoeleinden).
  • Dat wil zeggen een goed punt @jfpoilpret, ik heb geen rekening gehouden. Heeft u een zekere mate van efficiëntie ten opzichte van een dtostrf + concat-versie? Geldt hetzelfde voor sscanf ()? (trouwens, ik betwijfel nu of sscanf () echt goed werkt in arduino)
  • Ik heb geen daadwerkelijke metingen uitgevoerd om beide oproepen te vergelijken, maar ik denk dat je gewoon de C-code zou kunnen bekijken en eventueel kunt controleren de gegenereerde assembly. Met betrekking tot sscanf, IIRC heeft enkele beperkingen (met drijvende-kommagetallen denk ik).

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *