Pregunta:
¿Cómo puedo convertir Arduino String al tipo de cadena C?
diegoaguilar
2014-04-24 12:26:04 UTC
view on stackexchange narkive permalink

Obtuve un String que, según tengo entendido, es un objeto Arduino, y obtuve un código C ++:

  #include <Wire.h> #include <LiquidCrystal_I2C.h> # incluir <string.h>LiquidCrystal_I2C lcd (0x20,16,2); booleano borrar = falso; IP de cadena; configuración vacía () {lcd.init (); LCD luz de fondo(); pinMode (13, SALIDA); Serial.begin (9600); Serial1.begin (9600);} void loop () {while (Serial1.available ()) {char caracter = Serial1.read (); // Comprobamos el caracter switch (caracter) {predeterminado: if (borrar) {IP = ""; lcd.clear (); } lcd.print (caracter); retraso (125); borrar = falso; IP.concat (caracter); romper; case '\ r': case 0x0F: case 0x0A: String res = ""; borrar = verdadero; int num = atoi (IP.c_str ()); if (num < 127) res = "Clase A"; if (num == 127) res = "Dirección reservada"; if (num > 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"; romper; } // fin switch} // serial disponible} // fin programa  

Sin embargo, esto no se compilará debido a esta línea:

  int num = atoi (IP.c_str ())  

Como IP es una String y dicho método funciona para string . ¿Cómo puedo hacerlo compatible (convertirlo)?

Tres respuestas:
#1
+5
rmi
2014-04-24 13:30:58 UTC
view on stackexchange narkive permalink

Pruebe

  unsigned char z [100]; IP.getBytes (z, 100); z [IP.length ()] = 0; int n = atoi (z);  

Para recuperar bytes dentro de la cadena. Esto supone que la longitud de la cadena de IP es menor que 100.

Intenté y obtuve: `BluetoothLCD.cpp: 51: 35: error: conversión no válida de 'char *' a 'unsigned char *' BluetoothLCD.cpp: 51: 35: error: inicializando el argumento 1 de 'void String :: getBytes ( unsigned char *, unsigned int, unsigned int) const'`
He actualizado `char` a` unsigned char`
Algo extraño está sucediendo, ahora obtengo: `BluetoothLCD.cpp: 53: 33: error: conversión no válida de 'unsigned char *' a 'const char *' BluetoothLCD.cpp: 53: 33: error: inicializando el argumento 1 de ' int atoi (const char *) ''
Si no es compatible, se puede utilizar `IP.toCharArray (z, 100);`.
¿Cómo se vería el código?
Dios, creo que ya está hecho
#2
+2
Peter Bloomfield
2014-04-24 13:32:23 UTC
view on stackexchange narkive permalink

Intente actualizar a la última versión de las bibliotecas / IDE de Arduino.

El método c_str () se introdujo en la clase Arduino String recientemente, creo. Esa línea de código ciertamente funciona bien para mí en Arduino IDE 1.0.5.

Estoy usando Linux IDE, ¿cómo lo haría?
@diegoaguilar: creo que tendrías que actualizar manualmente tus bibliotecas centrales de Arduino. Puede obtenerlos de GitHub: https://github.com/arduino/Arduino
La versión 1.0.5 tiene c_str () y se puede descargar para Linux desde el sitio oficial de Arduino: http://arduino.cc/en/Main/Software
#3
+2
jfpoilpret
2014-04-25 10:12:10 UTC
view on stackexchange narkive permalink

Su código podría mejorarse eliminando el uso de la cadena IP por completo y calculando directamente su valor numérico mientras los caracteres ingresan a través de Serial1 :

  ... boolean borrar = false; int IP = 0; ... void loop () {while (Serial1.available ()) {char caracter = Serial1.read (); // Comprobamos el caracter switch (caracter) {// NOTA es mejor reemplazar default por la lista de todos los dígitos ... case '0': case '1': case '2': case '3': case ' 4 ': caso' 5 ': caso' 6 ': caso' 7 ': caso' 8 ': caso' 9 ': if (borrar) {IP = 0; lcd.clear (); } lcd.print (caracter); retraso (125); borrar = falso; IP * = 10; IP + = (int) (caracter - '0'); romper; case '\ r': case 0x0F: case 0x0A: String res = ""; borrar = verdadero; int num = IP; if (num < 127) res = "Clase A"; if (num == 127) res = "Direccion reservada"; if (num > 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"; romper; } // fin switch} // serial disponible} // fin programa  

De esta forma obtendría 2 ventajas:

  1. un poco más rápido que trabajar con String
  2. ninguna asignación / desasignación de memoria dinámica ( String hace muchas de estas), lo que podría llevar a su programa a la fragmentación del montón y eventualmente fallar.

Tenga en cuenta que no he refactorizado más su código, ya que supuse que era solo un fragmento, no el código completo de su programa. De lo contrario, habría realizado un refinamiento adicional como:

  • eliminar la variable num ya que es lo mismo que IP ahora
  • reemplace res de String por const char * (para reducir aún más la fragmentación del montón debido al uso de String )


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...