Problema al imprimir “Ethernet.localIP ()” en el Monitor Serial

2

Estoy usando Arduino Uno y Ethernet Shield. Tengo el siguiente código:

// My custom class.
class Logger {
  public:
    // Note: The 'message' is an Arduino's String object.
    void serial(String message) {
      Serial.print(message);
    }
};

void setup() {
  Logger logger;
  EthernetClient client;

  ...

  logger.serial("Some text: " + Ethernet.localIP()); // Here I have problems (keep reading for more information)
}

Cuando inicio Arduino, el Monitor Serial muestra G+dsé&¿ en lugar de Some text: 192.123.0.4 (nota: 192.123.0.4 es la IP de Internet asignada a Arduino). Sin embargo, si ejecuto Serial.print(Ethernet.localIP()); funciona como se esperaba e imprime Some text: 192.123.0.4 .

¿Por qué sucede? ¿Cómo puedo resolver el problema?

Además (ver comentarios):

logger.serial("Some text: " + 'other text'); // works
logger.serial("Some text: " + "other text"); // doesn't work (error is: "invalid operands of types 'const char [11]' and const char [10] to binary 'operator+'")
    
pregunta Backo

2 respuestas

3

Según sus mensajes de error, especialmente este:

error is: "invalid operands of types 'const char [11]' and const char [10] to binary 'operator+'"

parece que el operador "+" no está aprovechando un constructor predeterminado que convertiría un tipo de datos "const char []" primitivo en una cadena. Solo en una corazonada, ver si esto funciona:

logger.serial (String ("Some text") + Ethernet.localIP);

Básicamente obliga al compilador a convertir "Algún texto" en un objeto String para que el operador "+" pueda lidiar con él.

Específicamente, C ++ trata las constantes de cadena que pasó como tipo const char [], una matriz constante de caracteres. El operador "+" que intentas usar es en realidad un método de cadena de objeto; el operador "+" integrado en C ++ no sabe cómo concatenar cadenas por sí mismo, por lo que los autores de String agregaron su propio giro a "+" que sabe cómo poner objetos de String juntos. Class String tiene un constructor que puede convertir a const char [] en un objeto String, pero debido a la forma en que funcionan las reglas de conversión de tipos implícitas de C ++, C ++ no está dispuesto a ejecutar el constructor implícitamente si solo agregas dos matrices de caracteres. Sin embargo, si convierte explícitamente la primera matriz de caracteres en un objeto String, el operador "+" del objeto String puede ejecutarse, concatenando la segunda cadena en la primera.

    
respondido por el jtc
0

Estoy razonablemente seguro de que te estás quedando sin memoria o espacio de pila.

Arduino Serial cambios en la serie comportamiento del programa indeseablemente

El + da lugar a una nueva cadena, y están muy hambrientos de memoria.

    
respondido por el Erion

Lea otras preguntas en las etiquetas