Перетворення int або String у масив char на Arduino


81

Я отримую значення int від одного з аналогових штифтів на моєму Arduino. Як об'єднати це в a, Stringа потім перетворити в Stringa char[]?

Було запропоновано спробувати char msg[] = myString.getChars();, але я отримую повідомлення, getCharsяке не існує.


7
Вам справді потрібен модифікуваний масив? Якщо ні, ви можете скористатися const char * msg = myString.c_str();. На відміну від toCharArray(), c_str()це операція нульової копії, а нульова копія - це добре на пристроях, обмежених пам’яттю.
Едгар Бонет

@EdgarBonet Це працює, але одночасно лише для одного рядка. Останній c_str () перезаписує старіший.
mmv-ru

Відповіді:


134
  1. Щоб перетворити і додати ціле число, використовуйте оператор + = (або функція-член concat):

    String stringOne = "A long integer: ";
    stringOne += 123456789;
    
  2. Щоб отримати рядок як тип char[], використовуйте toCharArray () :

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

У цьому прикладі є простір лише для 49 символів (припускаючи, що він закінчується нулем). Можливо, ви захочете зробити розмір динамічним.

Накладні витрати

Вартість залучення String(вона не включається, якщо ніде не використовується на ескізі), становить приблизно 1212 байт програмної пам'яті (флеш-пам'ять) і 48 байт оперативної пам'яті.

Це було виміряно за допомогою Arduino IDE версії 1.8.10 (2019-09-13) для ескізу Arduino Leonardo .


13
Врятував мені багато часу на роздуми. Дякую! Для того, щоб зробити розмір char [] динамічним, зробіть щось на зразокchar charBuf[stringOne.length()+1]
loeschg

9
Я зробив це динамічно так: char ssid[ssidString.length()]; ssidString.toCharArray(ssid, ssidString.length());
dumbledad

1
@loeschg Дякую, спочатку я намагався без цього +1, але ваше рішення спрацювало для мене!
Філософ-помилка


1
Дуже приємна відповідь! Плюс один!
Даміан Рафаель Латтенеро,

57

Як посилання, ось приклад того, як конвертувати між динамічною довжиною Stringта char[]з нею -

Так, це боляче тупо для чогось такого простого, як перетворення типу, але, на жаль, це найпростіший спосіб.


14

Ви можете перетворити його на char *, якщо вам не потрібен модифікується рядок, використовуючи:

(char*) yourString.c_str();

Це було б дуже корисно, коли ви хочете опублікувати змінну String через MQTT в arduino.


1

Жодне з цього не спрацювало. Ось набагато простіший спосіб .. мітка str - це вказівник на те, що Є масивом ...

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;
    }
}

strне вказівник на масив, це Stringоб’єкт, що реалізує []оператор.
gre_gor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.