uusi arduino I: ssä kamppailee melko n00b-ongelman kanssa … olen kytketty nosta Adafruit-GPS-kortti Arduinolleni ja se toimii, kun se sylkee GPS-tiedot sarjaporttiin Serial.print(GPS.latitude, DEC)
Haluan nyt liittää merkkijonon jonka voin käsitellä (lue: Haluan lähettää sen ethernet-asiakkaan kautta.) Tämän sain jo:
...... 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);
Virhesanoma on: Call of overloaded "concat(float&)" is ambiguous
Kun olen Serial.print(GPS.latitude, DEC)
, tuloksena on: 4418.5937996050
Joten se on luultavasti iso tai jotain …
Kuinka voin yhdistää muunnelmat ja luoda pitkän merkkijonon?
kommentit
Answer
Concat-toiminto ei toteuta float-versiota, mutta jotkut merkistä char, int, unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
joten kääntäjä ei tiedä, kuinka heittää (todennäköisesti leijuva katkaisu) kokonaislukuun, koska niitä on useita vaihtoehtoja.
Sinun on ensin muunnettava float merkkijonoksi, käytettävä dtostrf () tai sprintf () ja sitten liitettävä merkkijonoon.
char outstr[25]; sprintf(outstr, "%f", GPS.latitude);
tai
dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs
Ja sitten:
vnnt.concat(outstr)
Huomaa myös, että sprintf on erittäin kätevä (char) -merkkijonon kompakti luominen:
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
Kommentit
- +1 epävarmassa tilanteessa,
sprintf
se ulos 🙂 - Yksi varoitus:
sprintf()
on monimutkainen toiminto, joten se on pikemminkin hidas ja käyttää melko vähän muistia. Yleensä välttäisin sitä " tuotanto " -koodilla (säilytetään vain virheenkorjaustarkoituksiin). - hyvä asia @jfpoilpret, en ottanut huomioon. Onko sinulla jonkin verran hyötysuhdetta verrattuna dtostrf + concat -versioon? Koskeeko sama mallia sscanf ()? (btw, epäilen nyt, toimiiko sscanf () todella arduinossa)
- En tehnyt todellisia mittauksia verratakseni molempia puheluja, mutta luulisin, että voisimme vain katsoa C-koodia ja mahdollisesti tarkistaa luotu kokoonpano.
sscanf
, IIRC: llä on joitain rajoituksia (mielestäni liukulukuilla).
vnnt
, kun taas toinen sanoovannut
GPS.latitude
-tietotyypin? Esimerkiksi. onko sefloat
,int
jne.?