Transformer une chaîne String en int

Je dois faire un programme qui doit lire un String (le string étant "A10121111"), le transformer en int et séparer chaque valeur par des virgules en excluant le A. Le problème étant que une fois que les valeurs de mon String sont bien séparer par des virgules. Quand je transforme mon String en Int, les virgules disparaissent et me laisse juste avec le "1" et le reste ne s'affiche pas.

Voici la partie du code qui est censé transformé le string en int

String str="A10121111";
String str2;
int i;
void setup() {
 Serial.begin(9600);
 str2[10]="0";
 //Serial.println(str.toInt()); 
 Serial.println(F("Concat word"));
 for(i=0;i<9;i++) 
 {
   if(i>=1&&i<=7)
    {
    str2=str2+str[i]+"."+" ";
   }
   if(i>=8) {
   str2=str2+str[i];
   }
   Serial.println(str2);
  
 } 
Serial.println(F(" end of string")); 
int entier[] = {str2.toInt()};
Serial.println(entier[i]);

}

je n'ai pas compris le cahier des charges... concrètement à quoi doit ressembler l'affichage si vous avez A10121111 en entrée ?

Le port série me renvoie 1,0,1,2,1,1,1,1 mais sous forme de string et je souhaite transformer cette chaîne en int (avec les virgules)

je ne comprends pas. Vous avez A10121111 en entrée ou vous avez 1,0,1,2,1,1,1,1 ? Si c'est le premier, c'est quoi ce A ? vous recevez de l'hexadécimal ?

(on se fiche de ce que fait votre code pour le moment - exprimez le cahier des charges)

Le A je veux juste le mettre de côté pour l’exploiter plus tard

un truc comme cela ?? (avec une cString pas une String)

char str[] = "A10121111";

void setup() {
  Serial.begin(115200); Serial.println();

  byte index = 0;
  int chiffre;
  while (str[index] != '\0') { // tant qu'on n'est pas à la fin de la chaîne
    if (index != 0) Serial.write(',');
    if (isdigit(str[index])) { // c'est un chiffre en ASCII
      chiffre =  str[index] - '0'; // on le convertit en chiffre décimal
      Serial.print(chiffre);
    } else {
      Serial.write('x'); // par exemple on met un x quand on a lu un caractère qui n'est pas un chiffre
    }
    index++; // on passe au caractère suivant
  }
  Serial.println();
}

void loop() {}

Oui un truc comme ça (j’essayerais demain car j’ai pas accès au PC avec le code de l’Arduino actuellement) en tout cas merci de ton aide !

Le code marche très bien merci. Mais serait-il possible d'exploiter ensuite la chaîne écrite dans le port série? L'utiliser comme une variable par exemple

Ce que vous envoyez au port série est parti / perdu (reçu de l’autre côté).

Si vous voulez fabriquer la chaîne correspondante il faut enregistrer en mémoire - dans un buffer assez grand - ce que vous avez imprimé

Pourquoi voulez vous mettre ce texte dans une variable ? L’autre forme sans les virgules est plus compact et prend donc moins de mémoire

Voici mon code entier pour avoir un peu plus de contexte

#include <FastLED.h>
#define LED_PIN 2
#define NUM_LEDS 150
char str[]="A10121111";
int i;
int chiffre;
CRGB leds[NUM_LEDS];
  byte index = 0;
void setup(){
FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  Serial.begin(115200); 
  Serial.println(F("Transformation de la chaîne char en entier int"));


  
  while (str[index] != '\0') { // tant qu'on n'est pas à la fin de la chaîne
    if (index != 0) Serial.write(", ");
    if (isdigit(str[index])) { // c'est un chiffre en ASCII
      chiffre =  str[index] - '0'; // on le convertit en chiffre décimal
      Serial.print(chiffre);
    } else {
      Serial.write("x"); // par exemple on met un x quand on a lu un caractère qui n'est pas un chiffre
    }
    index++; // on passe au caractère suivant
  }
  Serial.println();
}
byte trame[] = {};

void loop() {
  for(i=0; i<=8; i++){
    if (trame[i] == 0) {
      leds[i] = CRGB(0,0,255);
  FastLED.show();
    }
    else if(trame[i] == 2) {
      leds[i] = CRGB(255,0,0);
  FastLED.show();
    }
    else if(trame[i] == 1) {

      leds[i] = CRGB(75,255,0);
  FastLED.show();
    }
  }
}

Ce que j'essayais de dire c'est que je veux séparer chaque valeur la chaîne "A10121111" par des virgules et ensuite transformer cette chaine en entier en conservant les virgules pour l'utiliser dans le "byte trame[8] = {"la variable int avec les virgules"}". Le int doit être "1,0,1,2,1,1,1,1" pour que quand je l'utilise dans le byte trame[8] le contenu du tableau soit "byte trame[8] = {1,0,1,2,1,1,1,1};".

Pourquoi le format ascii avec les accolades ? A quoi ça va servir ?

Tout est cablé en dur là vous pourriez faire carrément un tableau d’entiers avec les valeurs

Car ensuite je remplacerai le A10121111 par une variable qui va chercher une donnée dans une base de donnée

OK - mais à quoi ça sert d'avoir

Le int doit être "1,0,1,2,1,1,1,1"

créez un tableau de byte directement, pas besoin d'une autre chaîne de caractères

char str[] = "A10121111";
byte memoire[sizeof str]; // comme ça on est sûr qu'il est assez grand

void setup() {
  Serial.begin(115200); Serial.println();

  byte index = 0, total = 0;
  while (str[index] != '\0') { // tant qu'on n'est pas à la fin de la chaîne
    if (isdigit(str[index])) { // c'est un chiffre en ASCII
      memoire[total++] =  str[index] - '0'; // on le convertit en chiffre décimal
    }
    index++;
  }
  // ici le tableau memoire contient total éléments
  for (byte i = 0; i < total; i++) Serial.println(memoire[i]);

}

void loop() {}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.