Conversión de un int o String en una matriz de caracteres en Arduino

81

Obtengo un valor int de uno de los pines analógicos de mi Arduino. ¿Cómo concateno esto a ay Stringluego convierto el en Stringa char[]?

Se sugirió que lo intentara char msg[] = myString.getChars();, pero estoy recibiendo un mensaje que getCharsno existe.

Chris
fuente
7
¿Realmente necesitas una matriz modificable? Si no, puede usar const char * msg = myString.c_str();. A diferencia de toCharArray(), c_str()es una operación de copia cero, y la copia cero es algo bueno en dispositivos con limitaciones de memoria.
Edgar Bonet
@EdgarBonet Funciona, pero solo para una cadena a la vez. El último c_str () sobrescribe más antiguo.
mmv-ru

Respuestas:

134
  1. Para convertir y agregar un número entero, use operator + = (o función miembro concat):

    String stringOne = "A long integer: ";
    stringOne += 123456789;
    
  2. Para obtener la cadena como tipo char[], use toCharArray () :

    char charBuf[50];
    stringOne.toCharArray(charBuf, 50)
    

En el ejemplo, solo hay espacio para 49 caracteres (suponiendo que termine con un valor nulo). Es posible que desee hacer que el tamaño sea dinámico.

Gastos generales

El costo de traer String(no está incluido si no se usa en ninguna parte del boceto) es de aproximadamente 1212 bytes de memoria de programa (flash) y 48 bytes de RAM.

Esto se midió utilizando Arduino IDE versión 1.8.10 (2019-09-13) para un boceto Arduino Leonardo .

Peter Mortensen
fuente
13
Me ahorró mucho tiempo de retoques. ¡Gracias! Para hacer que el tamaño de char [] sea dinámico, haz algo comochar charBuf[stringOne.length()+1]
loeschg
9
Lo hice dinámicamente así: char ssid[ssidString.length()]; ssidString.toCharArray(ssid, ssidString.length());
dumbledad
1
@loeschg Gracias, lo intenté sin el +1primero, ¡pero tu solución funcionó para mí!
Filósofo torpe
1
¡Muy buena respuesta! ¡Mas uno!
Damián Rafael Lattenero
57

Solo como referencia, aquí hay un ejemplo de cómo convertir entre Stringy char[]con una longitud dinámica:

// Define 
String str = "This is my string"; 

// Length (with one extra character for the null terminator)
int str_len = str.length() + 1; 

// Prepare the character array (the buffer) 
char char_array[str_len];

// Copy it over 
str.toCharArray(char_array, str_len);

Sí, esto es dolorosamente obtuso para algo tan simple como una conversión de tipo, pero lamentablemente es la forma más fácil.

Alex King
fuente
14

Puede convertirlo a char * si no necesita una cadena modificable usando:

(char*) yourString.c_str();

Esto sería muy útil cuando desee publicar una variable de cadena a través de MQTT en arduino.

Linh Le Vu
fuente
1

Nada de eso funcionó. Aquí hay una forma mucho más simple ... la etiqueta str es el puntero a lo que ES una matriz ...

String str = String(yourNumber, DEC); // Obviously .. get your int or byte into the string

str = str + '\r' + '\n'; // Add the required carriage return, optional line feed

byte str_len = str.length();

// Get the length of the whole lot .. C will kindly
// place a null at the end of the string which makes
// it by default an array[].
// The [0] element is the highest digit... so we
// have a separate place counter for the array...

byte arrayPointer = 0;

while (str_len)
{
    // I was outputting the digits to the TX buffer

    if ((UCSR0A & (1<<UDRE0))) // Is the TX buffer empty?
    {
        UDR0 = str[arrayPointer];
        --str_len;
        ++arrayPointer;
    }
}
usuario6776703
fuente
strno es un puntero a una matriz, es un Stringobjeto que implementa el []operador.
gre_gor