Kuinka rakentaa (liittää) merkkijono suurilla numeroilla

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

  • Aren ' t puuttuuko puolipiste?
  • ja yksi sanoo vnnt, kun taas toinen sanoo vannut
  • Anteeksi kirjoitusvirhe ' s 🙂
  • Tiedätkö GPS.latitude -tietotyypin? Esimerkiksi. onko se float, int jne.?
  • Luulen sen olevan ' onko kelluva? Se sanoo kelluvan virhesanomassa. Kuinka saan selville? Onko var_dump tai jotain?

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *