Konvertieren eines int oder String in ein char-Array auf Arduino

81

Ich erhalte einen int-Wert von einem der analogen Pins auf meinem Arduino. Wie verkette ich dies zu a Stringund konvertiere das dann Stringzu a char[]?

Es wurde vorgeschlagen, dass ich es versuche char msg[] = myString.getChars();, aber ich erhalte eine Nachricht, getCharsdie nicht existiert.

Chris
quelle
7
Benötigen Sie wirklich ein modifizierbares Array? Wenn nicht, könnten Sie verwenden const char * msg = myString.c_str();. Im Gegensatz zu toCharArray(), c_str()ist eine Null-Kopier - Funktion, und Null-Kopie ist eine gute Sache auf Speicher-constrained Geräte.
Edgar Bonet
@EdgarBonet Es funktioniert, aber immer nur für eine Zeichenfolge. Letzter c_str () überschreibt älter.
mmv-ru

Antworten:

134
  1. Verwenden Sie zum Konvertieren und Anhängen einer Ganzzahl den Operator + = (oder die Elementfunktion concat):

    String stringOne = "A long integer: ";
    stringOne += 123456789;
    
  2. char[]Verwenden Sie toCharArray (), um die Zeichenfolge als Typ abzurufen :

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

Im Beispiel ist nur Platz für 49 Zeichen (vorausgesetzt, es wird mit null abgeschlossen). Möglicherweise möchten Sie die Größe dynamisch gestalten.

Overhead

Die Kosten für das Einbringen String(es ist nicht enthalten, wenn es nicht irgendwo in der Skizze verwendet wird) betragen ungefähr 1212 Byte Programmspeicher (Flash) und 48 Byte RAM.

Dies wurde unter Verwendung von Arduino IDE Version 1.8.10 (2019-09-13) für eine Arduino Leonardo- Skizze gemessen .

Peter Mortensen
quelle
13
Hat mir viel Zeit zum Basteln gespart. Vielen Dank! Um die char [] Größe dynamisch zu machen, machen Sie etwas wiechar charBuf[stringOne.length()+1]
loeschg
9
Ich habe es dynamisch so gemacht: char ssid[ssidString.length()]; ssidString.toCharArray(ssid, ssidString.length());
Dumbledad
1
@loeschg Danke, ich habe es zunächst ohne versucht +1, aber deine Lösung hat bei mir funktioniert!
Fehlerhafter Philosoph
1
Sehr schöne Antwort! Plus eins!
Damián Rafael Lattenero
57

Als Referenz finden Sie hier ein Beispiel für die Konvertierung zwischen Stringund char[]mit einer dynamischen Länge.

// 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);

Ja, dies ist schmerzlich stumpf für etwas so Einfaches wie eine Typkonvertierung, aber leider ist es der einfachste Weg.

Alex King
quelle
14

Sie können es in char * konvertieren, wenn Sie keine änderbare Zeichenfolge benötigen, indem Sie Folgendes verwenden:

(char*) yourString.c_str();

Dies ist sehr nützlich, wenn Sie eine String-Variable über MQTT in Arduino veröffentlichen möchten.

Linh Le Vu
quelle
1

Nichts davon hat funktioniert. Hier ist ein viel einfacherer Weg. Das Label str ist der Zeiger auf das, was ein Array ist ...

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;
    }
}
user6776703
quelle
strist kein Zeiger auf ein Array, sondern ein StringObjekt, das den []Operator implementiert .
gre_gor