Kysymys:
Kuinka voin muuntaa Arduino-merkkijonon C-merkkijonotyypiksi?
diegoaguilar
2014-04-24 12:26:04 UTC
view on stackexchange narkive permalink

Sain merkkijono , joka ymmärtääkseni on Arduino-objekti, ja sain jonkin verran C ++ -koodia:

  #include <Wire.h> #include <LiquidCrystal_I2C.h> sisältää <string.h>LiquidCrystal_I2C lcd (0x20,16,2); boolen borrar = false; String IP; void setup () {lcd.init (); lcd.taustavalo (); pinMode (13, OUTPUT); Sarjan alku (9600); Serial1.begin (9600);} void loop () {while (Serial1.available ()) {char caracter = Serial1.read (); // Comprobamos el -merkkikytkin (caracter) {oletus: if (borrar) {IP = ""; lcd.clear (); } lcd.print (merkki); viive (125); laina = väärä; IP.konttu (karakter); tauko; tapaus '\ r': tapaus 0x0F: tapaus 0x0A: Merkkijono res = ""; laina = tosi; int numero = atoi (IP.c_str ()); if (numero < 127) res = "Vaihe A"; if (num == 127) res = "Direccion reservada"; if (numero > 127 && num < 192) res = "Clase B"; if (num > = 192 && num < 224) res = "Clase C"; if (num > = 224 && num < 240) res = "Clase D"; if (num > = 240 && num < 255) res = "Clase E"; tauko; } // fin switch} // serial disponible} // fin program  

Tätä ei kuitenkaan käännetä tämän rivin takia:

  int num = atoi (IP.c_str ())  

Koska IP on String ja tällainen menetelmä toimii merkkijono . Kuinka voin tehdä siitä yhteensopivan (muuntaa)?

Kolme vastused:
rmi
2014-04-24 13:30:58 UTC
view on stackexchange narkive permalink

Yritä

  allekirjoittamaton merkki z [100]; IP.getBytes (z, 100); z [IP.pituus ()] = 0; int n = atoi (z);  

Tavujen hakeminen merkkijonosta. Oletetaan, että IP-merkkijonon pituus on alle 100.

Yritin saada: `` BluetoothLCD.cpp: 51: 35: virhe: virheellinen muuntaminen char *: sta allekirjoittamattomaan char * BluetoothLCD.cpp: 51: 35: virhe: alustamalla argumentin 1 tuotteesta 'void String :: getBytes ( unsigned char *, unsigned int, unsigned int) const ''
Olen päivittänyt "char" -merkiksi "unsigned char"
Jotain outoa on meneillään, nyt saan: `` BluetoothLCD.cpp: 53: 33: virhe: virheellinen muunnos allekirjoittamattomasta char *: sta 'const char *' BluetoothLCD.cpp: 53: 33: virhe: alustetaan argumentti 1 / int atoi (const char *) ''
Jos se ei tue, voidaan käyttää `IP.toCharArray (z, 100);`.
Kuinka koodi näyttäisi?
Jumala, luulen, että se on tehty NYT
Peter Bloomfield
2014-04-24 13:32:23 UTC
view on stackexchange narkive permalink

Yritä päivittää Arduino-kirjastojen / IDE: n uusimpaan versioon.

Uskon, että c_str () -menetelmä otettiin käyttöön Arduino String -luokassa melko hiljattain. Tämä koodirivi toimii varmasti minulle hyvin Arduino IDE 1.0.5: ssä.

Käytän Linux IDE: tä, miten tekisin sen?
@diegoaguilar - Luulen, että joudut päivittämään Arduino-ydinkirjastosi manuaalisesti. Voit hankkia ne GitHubista: https://github.com/arduino/Arduino
Versiossa 1.0.5 on c_str (), se voidaan ladata linuxille viralliselta Arduino-sivustolta: http://arduino.cc/en/Main/Software
jfpoilpret
2014-04-25 10:12:10 UTC
view on stackexchange narkive permalink

Koodiasi voidaan parantaa poistamalla IP -merkkijono kokonaan ja laskemalla suoraan sen numeerinen arvo, kun merkkejä tulee sisään Serial1 :

  ... Boolen borrar = false; int IP = 0; ... void loop () {while (Serial1.available ()) {char caracter = Serial1.read (); // Comprobamos el caracter switch (caracter) {// HUOMAUTUS on parempi korvata oletus kaikkien numeroiden luettelolla ... tapaus '0': tapaus '1': tapaus '2': tapaus '3': tapaus ' 4 ': tapaus' 5 ': tapaus' 6 ': tapaus' 7 ': tapaus' 8 ': tapaus' 9 ': jos (laina) {IP = 0; lcd.clear (); } lcd.print (merkki); viive (125); laina = väärä; IP * = 10; IP + = (int) (merkki - '0'); tauko; tapaus '\ r': tapaus 0x0F: tapaus 0x0A: Merkkijono res = ""; laina = tosi; int numero = IP; if (numero < 127) res = "Vaihe A"; if (num == 127) res = "Direccion reservada"; if (numero > 127 && numero < 192) res = "Clase B"; if (num > = 192 && num < 224) res = "Clase C"; if (num > = 224 && num < 240) res = "Clase D"; if (num > = 240 && num < 255) res = "Clase E"; tauko; } // fin switch} // serial disponible} // fin program  

Tällä tavalla saat 2 etua:

  1. vähän nopeammin kuin kanssa String
  2. ei dynaamista muistin allokointia / jakautumista ( String tekee paljon näistä), mikä saattaa johtaa ohjelmaasi kasan pirstoutumiseen ja lopulta kaatumiseen.

Huomaa, että en ole muokannut koodiasi uudelleen, koska arvasin sen olevan vain koodinpätkä, ei koko ohjelmasi koodi. Muuten olisin tehnyt tarkennuksia kuten:

  • poista num -muuttuja, koska se on sama kuin IP nyt
  • korvaa res -kohdasta merkkijono muotoon const char * (vähentää edelleen kasan pirstoutumista String -käytön vuoksi)


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...