Konwersja int lub String na tablicę znaków w Arduino

81

Otrzymuję wartość int z jednego z pinów analogowych na moim Arduino. Jak mogę łączyć to do Stringa następnie przekonwertować Stringdo char[]?

Zasugerowano, żebym spróbował char msg[] = myString.getChars();, ale otrzymuję wiadomość, getCharsktóra nie istnieje.

Chris
źródło
7
Czy naprawdę potrzebujesz modyfikowalnej tablicy? Jeśli nie, możesz użyć const char * msg = myString.c_str();. W przeciwieństwie do toCharArray(), c_str()jest operacją zerowej kopii, a zerowa kopia jest dobra na urządzeniach z ograniczoną pamięcią.
Edgar Bonet
@EdgarBonet Działa, ale tylko dla jednego ciągu na raz. Last c_str () nadpisuje starsze.
mmv-ru

Odpowiedzi:

134
  1. Aby przekonwertować i dołączyć liczbę całkowitą, użyj operatora + = (lub funkcji składowej concat):

    String stringOne = "A long integer: ";
    stringOne += 123456789;
    
  2. Aby uzyskać ciąg jako typ char[], użyj toCharArray () :

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

W tym przykładzie jest tylko miejsce na 49 znaków (przy założeniu, że jest zakończone znakiem null). Możesz chcieć, aby rozmiar był dynamiczny.

Nad głową

Koszt wprowadzenia String(nie jest uwzględniony, jeśli nie jest używany nigdzie w szkicu), to około 1212 bajtów pamięci programu (flash) i 48 bajtów pamięci RAM.

Zostało to zmierzone przy użyciu Arduino IDE w wersji 1.8.10 (2019-09-13) dla szkicu Arduino Leonardo .

Peter Mortensen
źródło
13
Zaoszczędziło mi dużo czasu na majsterkowanie. Dzięki! Aby uczynić rozmiar char [] dynamicznym, zrób coś takiegochar charBuf[stringOne.length()+1]
loeschg
9
Zrobiłem to dynamicznie tak: char ssid[ssidString.length()]; ssidString.toCharArray(ssid, ssidString.length());
dumbledad
1
@loeschg Dzięki, próbowałem bez +1pierwszego, ale Twoje rozwiązanie zadziałało dla mnie!
Blundering Philosopher
1
Bardzo ładna odpowiedź! Plus jeden!
Damián Rafael Lattenero
57

Jako odniesienie, oto przykład konwersji między Stringi char[]z dynamiczną długością -

Tak, jest to boleśnie tępe w przypadku czegoś tak prostego jak konwersja typu, ale niestety jest to najłatwiejszy sposób.

Alex King
źródło
14

Możesz przekonwertować go na znak *, jeśli nie potrzebujesz modyfikowalnego ciągu, używając:

(char*) yourString.c_str();

Byłoby to bardzo przydatne, gdy chcesz opublikować zmienną typu String za pośrednictwem MQTT w arduino.

Linh Le Vu
źródło
1

Żadna z tych rzeczy nie działała. Oto o wiele prostszy sposób ... etykieta jest wskaźnikiem do tego, co JEST tablicą ...

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
źródło
strnie jest wskaźnikiem do tablicy, jest to Stringobiekt implementujący []operator.
gre_gor,