Comment convertir int en chaîne sur Arduino?

Comment convertir un int, n , en une chaîne de manière à ce que lorsque je l’envoie par la suite, il soit envoyé sous forme de chaîne?

C’est 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++; } 

Utilisez comme ceci:

 Ssortingng mySsortingng = Ssortingng(n); 

Vous pouvez trouver plus d’exemples ici .

Vous pouvez simplement faire:

 Serial.println(n); 

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

utilisez la fonction itoa() 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) 

Vous avez juste besoin de l’enrouler autour d’un object Ssortingng comme celui-ci:

 Ssortingng numberSsortingng = Ssortingng(n); 

Vous pouvez aussi faire:

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

Cette solution est optimisée pour la conversion de int (entier 16 bits signé) en chaîne.

Cette implémentation évite l’utilisation de la division car l’AVR 8 bits utilisé pour Arduino n’a pas d’instruction DIV matérielle, le compilateur traduit la division en soustractions répétitives qui prennent du temps. Ainsi, la solution la plus rapide consiste à utiliser des twigs conditionnelles pour créer la chaîne.

Un tampon fixe de 7 octets préparé à partir du début de la RAM pour éviter une allocation dynamic. Comme il ne s’agit que de 7 octets, le coût d’utilisation de la RAM fixe est considéré comme minimum. Pour aider le compilateur, nous ajoutons le modificateur de registre dans la déclaration de variable 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() {} 

Cette esquisse est compilée avec 1 082 octets de code en utilisant avr-gcc qui a été fourni avec Arduino v1.0.5 (la taille de la fonction int2str elle-même est de 594 octets). Comparée à la solution utilisant un object Ssortingng compilé en 2 398 octets, cette implémentation peut réduire la taille de votre code de 1,2 Ko (en supposant que vous n'avez besoin d'aucune autre méthode d'object Ssortingng, et que votre nombre soit ssortingct par rapport au type signé).

Cette fonction peut être optimisée en l’écrivant en code assembleur correct.

La solution est beaucoup trop grande. Essayez ce simple. Veuillez fournir un tampon de plus de 7 caractères, sans chèque.

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

Peut être facilement modifié pour rendre la fin du tampon, si vous ignorez l’index ‘l’ et incrémentez directement le tampon.

Ci-dessous se trouve un auto-composé myitoa () qui est beaucoup plus petit en code et réserve un tableau FIXED de 7 (y compris 0) dans char * myssortingng, ce qui est souvent souhaitable. Il est évident que l’on peut construire le code avec un changement de caractère, si l’on a besoin d’une chaîne de sortie de longueur variable.

 void myitoa(int number, char *myssortingng) { boolean negative = number>0; myssortingng[0] = number<0? '-' : '+'; number = number<0 ? -number : number; for (int n=5; n>0; n--) { myssortingng[n] = ' '; if(number > 0) myssortingng[n] = number%10 + 48; number /= 10; } myssortingng[6]=0; } 

dans le premier exemple, une chaîne C classique est utilisée: il ne s’agit que d’un tableau de caractères terminé par un zéro (caractère NUL). d’autres exemples utilisent la classe Ssortingng, une classe C ++ que je voudrais éloigner des exemples de jouets et des minuscules démos. Il y a des memory leaks qui ne sont pas faciles à prédire, ce qui conduit à de mystérieux blocages du tableau.