Wie konvertiere ich int in einen String auf Arduino?


90

Wie konvertiere ich ein int ,, nin eine Zeichenfolge, sodass es beim Senden über die Seriennummer als Zeichenfolge gesendet wird?

Das habe ich bisher:

int ledPin=13;
int testerPin=8;
int n=1;

char buf[10];

void setup()
{
    pinMode(ledPin, OUTPUT);
    pinMode(testerPin, OUTPUT);
    Serial.begin(115200);
}

void loop()
{
    digitalWrite(ledPin, HIGH);
    sprintf(buf, "Hello!%d", n);
    Serial.println(buf);
    delay(500);
    digitalWrite(ledPin, LOW);
    delay(500);

    n++;
}

3
@Pubby "printf () vergrößert Ihr ausführbares Objekt um ~ 1000 Byte, sodass Sie es möglicherweise nicht verwenden möchten, wenn die Größe ein Problem darstellt." playground.arduino.cc/Main/Printf
Marcello Romani

Antworten:


127

Verwenden Sie wie folgt:

String myString = String(n);

Weitere Beispiele finden Sie hier .


2
Sie müssen kein String-Objekt verwenden, Serial.print oder println konvertieren sie bereits!
Alexis Paques

Ich suche nach einer Möglichkeit, 97 in ein A-Zeichen oder 65 in ein A-Zeichen umzuwandeln. Ich meine ASCII-Nummer zum Zeichen. Ich fand, dass dieser Weg nicht funktioniert.
Oki Erie Rinaldi

@OkiErieRinaldi: Sie können verwenden - char bar = 97; es wird klappen.
Cassio

25

Verwenden Sie die in enthaltene itoa()Funktionstdlib.h

char buffer[7];         //the ASCII of the integer will be stored in this char array
itoa(-31596,buffer,10); //(integer, yourBuffer, base)


13

Sie müssen es nur wie folgt um ein String-Objekt wickeln:

String numberString = String(n);

Sie können auch tun:

String stringOne = "Hello String";                     // using a constant String
String stringOne =  String('a');                       // converting a constant char into a String
String stringTwo =  String("This is a string");        // converting a constant string into a String object
String stringOne =  String(stringTwo + " with more");  // concatenating two strings
String stringOne =  String(13);                        // using a constant integer
String stringOne =  String(analogRead(0), DEC);        // using an int and a base
String stringOne =  String(45, HEX);                   // using an int and a base (hexadecimal)
String stringOne =  String(255, BIN);                  // using an int and a base (binary)
String stringOne =  String(millis(), DEC);             // using a long and a base

9

Dies ist eine geschwindigkeitsoptimierte Lösung zum Konvertieren von int (vorzeichenbehaftete 16-Bit-Ganzzahl) in Zeichenfolgen.

Diese Implementierung vermeidet die Verwendung der Division, da der für Arduino verwendete 8-Bit-AVR keinen Hardware-DIV-Befehl hat. Der Compiler übersetzt die Division in zeitaufwändige wiederholte Subtraktionen. Daher besteht die schnellste Lösung darin, bedingte Verzweigungen zum Erstellen der Zeichenfolge zu verwenden.

Ein fester 7-Byte-Puffer, der von Anfang an im RAM vorbereitet wurde, um eine dynamische Zuordnung zu vermeiden. Da es nur 7 Bytes sind, werden die Kosten für die feste RAM-Nutzung als minimal angesehen. Um den Compiler zu unterstützen, fügen wir der Variablendeklaration den Registermodifikator hinzu, um die Ausführung zu beschleunigen.

char _int2str[7];
char* int2str( register int i ) {
  register unsigned char L = 1;
  register char c;
  register boolean m = false;
  register char b;  // lower-byte of i
  // negative
  if ( i < 0 ) {
    _int2str[ 0 ] = '-';
    i = -i;
  }
  else L = 0;
  // ten-thousands
  if( i > 9999 ) {
    c = i < 20000 ? 1
      : i < 30000 ? 2
      : 3;
    _int2str[ L++ ] = c + 48;
    i -= c * 10000;
    m = true;
  }
  // thousands
  if( i > 999 ) {
    c = i < 5000
      ? ( i < 3000
          ? ( i < 2000 ? 1 : 2 )
          :   i < 4000 ? 3 : 4
        )
      : i < 8000
        ? ( i < 6000
            ? 5
            : i < 7000 ? 6 : 7
          )
        : i < 9000 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    i -= c * 1000;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // hundreds
  if( i > 99 ) {
    c = i < 500
      ? ( i < 300
          ? ( i < 200 ? 1 : 2 )
          :   i < 400 ? 3 : 4
        )
      : i < 800
        ? ( i < 600
            ? 5
            : i < 700 ? 6 : 7
          )
        : i < 900 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    i -= c * 100;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // decades (check on lower byte to optimize code)
  b = char( i );
  if( b > 9 ) {
    c = b < 50
      ? ( b < 30
          ? ( b < 20 ? 1 : 2 )
          :   b < 40 ? 3 : 4
        )
      : b < 80
        ? ( i < 60
            ? 5
            : i < 70 ? 6 : 7
          )
        : i < 90 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    b -= c * 10;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // last digit
  _int2str[ L++ ] = b + 48;
  // null terminator
  _int2str[ L ] = 0;  
  return _int2str;
}

// Usage example:
int i = -12345;
char* s;
void setup() {
  s = int2str( i );
}
void loop() {}

Diese Skizze wird mit avr-gcc, das mit Arduino v1.0.5 gebündelt ist, zu 1.082 Byte Code kompiliert (die Größe der int2str-Funktion selbst beträgt 594 Byte). Im Vergleich zu einer Lösung mit einem String-Objekt, das in 2.398 Byte kompiliert wurde, kann diese Implementierung Ihre Codegröße um 1,2 KB reduzieren (vorausgesetzt, Sie benötigen keine andere String-Objektmethode und Ihre Nummer ist streng nach signiertem int-Typ).

Diese Funktion kann weiter optimiert werden, indem sie in den richtigen Assembler-Code geschrieben wird.


1
Ein alternativer Ansatz zur Vermeidung von DIV besteht darin, mit (2 ^ N / 10) zu multiplizieren und dann mit N Bits nach rechts zu verschieben. Für N = 16 ist x / 10 ~ = (x * 6554) >> 16. Nahe genug für die meisten Ziffern.
David R Tribble

1

Die Lösung ist viel zu groß. Versuchen Sie dieses einfache. Bitte geben Sie einen Puffer mit mehr als 7 Zeichen an, ohne dass eine Überprüfung durchgeführt wurde.

char *i2str(int i, char *buf){
  byte l=0;
  if(i<0) buf[l++]='-';
  boolean leadingZ=true;
  for(int div=10000, mod=0; div>0; div/=10){
    mod=i%div;
    i/=div;
    if(!leadingZ || i!=0){
       leadingZ=false;
       buf[l++]=i+'0';
    }
    i=mod;
  }
  buf[l]=0;
  return buf;
}

Kann leicht geändert werden, um das Ende des Puffers zurückzugeben, wenn Sie den Index 'l' verwerfen und den Puffer direkt erhöhen.


0

Hier unten ist eine selbst komponierte myitoa (), die im Code weitaus kleiner ist und ein FIXED-Array von 7 (einschließlich der Beendigung von 0) in char * mystring reserviert, was häufig wünschenswert ist. Es ist offensichtlich, dass man den Code stattdessen mit Zeichenverschiebung erstellen kann, wenn man eine Ausgabezeichenfolge variabler Länge benötigt.

void myitoa(int number, char *mystring) {
  boolean negative = number>0;

  mystring[0] = number<0? '-' : '+';
  number = number<0 ? -number : number;
  for (int n=5; n>0; n--) {
     mystring[n] = ' ';
     if(number > 0) mystring[n] = number%10 + 48;
     number /= 10;
  }  
  mystring[6]=0;
}


0

Das funktioniert einfach bei mir:

int bpm = 60;
char text[256];
sprintf(text, "Pulso: %d     ", bpm);
//now use text as string
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.