128 votes

Comment convertir un int en string sur Arduino ?

Comment convertir un int, n en une chaîne de caractères de sorte que lorsque je l'envoie par la série, il est envoyé comme une chaîne de caractères ?

Voici ce que j'ai jusqu'à présent :

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

4 votes

@Pubby "printf() rend votre objet exécutable ~1000 octets plus grand, donc vous pouvez ne pas vouloir l'utiliser si la taille est un problème." playground.arduino.cc/Main/Printf

1 votes

190voto

Cassio Points 1051

Utilisez comme ça :

String myString = String(n);

Vous pouvez trouver d'autres exemples aquí .

7 votes

Vous n'avez pas besoin d'utiliser un objet String, Serial.print ou println les convertissent déjà !

0 votes

Je cherche le moyen de convertir 97 en caractère 'a' ou 65 en caractère 'A'. Je veux dire le numéro ASCII en caractère. J'ai découvert que cette méthode ne fonctionne pas.

0 votes

@OkiErieRinaldi : Vous pouvez utiliser - char bar = 97 ; cela fonctionnera.

34voto

Utiliser le itoa() fonction incluse dans stdlib.h

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

26voto

Matthew Murdoch Points 11530

Vous pouvez simplement le faire :

Serial.println(n);

qui convertira n en une chaîne ASCII automatiquement. Voir la documentation pour Serial.println() .

11voto

vcc2gnd Points 51

Il s'agit d'une solution optimisée en termes de vitesse pour la conversion de int (entier signé de 16 bits) en chaîne de caractères.

Cette mise en œuvre évite d'utiliser la division puisque l'AVR 8 bits utilisé pour l'Arduino n'a pas d'instruction DIV matérielle, le compilateur traduit la division en soustractions répétitives qui prennent du temps. La solution la plus rapide est donc d'utiliser les branches conditionnelles pour construire la chaîne.

Un tampon fixe de 7 octets préparé dès le début en RAM pour éviter l'allocation dynamique. Comme il ne s'agit que de 7 octets, le coût de l'utilisation de la RAM fixe est considéré comme minimal. Pour aider le compilateur, nous ajoutons un modificateur de registre dans la déclaration des variables pour accélérer l'exécution.

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() {}

Ce sketch est compilé en 1 082 octets de code à l'aide de avr-gcc qui est fourni avec Arduino v1.0.5 (la taille de la fonction int2str elle-même est de 594 octets). Par rapport à la solution utilisant l'objet String qui a été compilé en 2,398 octets, cette implémentation peut réduire la taille de votre code de 1.2 Kb (en supposant que vous n'avez pas besoin d'une autre méthode d'objet String, et que votre nombre est strict au type int signé).

Cette fonction peut être optimisée davantage en l'écrivant dans un code assembleur approprié.

2 votes

Une approche alternative pour éviter les DIV est de multiplier par (2^N/10) puis de décaler vers la droite de N bits. Donc pour N=16, x/10 ~= (x*6554)>>16. C'est assez proche pour la plupart des chiffres, de toute façon.

1 votes

C'est... de l'art.

2voto

Enumerator Points 61
String msg;
if(Serial.available() > 0)
{
  while(Serial.available() > 0)
  {
    msg += char(Serial.read());
    delay(3);
  }
  Serial.println(msg);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X