Problema al imprimir "Ethernet.localIP()" en Serial Monitor

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, aparece Serial Monitor G+dsé&¿en lugar de Some text: 192.123.0.4(nota: 192.123.0.4es la IP de Internet asignada a Arduino). Sin embargo, si lo ejecuto, Serial.print(Ethernet.localIP());funciona como se esperaba e imprime Some text: 192.123.0.4.

¿Por que 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+'")

Respuestas (2)

Basado en 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 primitivo "const char[]" en una cadena. Solo por una corazonada, mira 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 manejarlo.

Específicamente, C++ trata las constantes de cadena que pasó como tipo const char[], una matriz constante de caracteres. El operador "+" que está tratando de usar es en realidad un método de objeto String; el operador "+" integrado en C++ no sabe cómo concatenar cadenas por sí solo, por lo que los autores de String agregaron su propio giro en "+" que sabe cómo unir objetos String. Class String tiene un constructor que puede convertir un 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 implícitamente el constructor si solo agrega 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 con la primera.

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

Arduino Serial print cambia el comportamiento del programa indeseablemente

El + da lugar a una nueva cadena, y tienen mucha memoria.