récupérer contenu du port serie et le stocker dans des varibales

Bonjour,

je suis nouveau en programmation et j'aimerais mettre au point un programme qui récupère une chaine de caractères écrite sur le port série " @0xAbR0x88D10101 " et la decomposer et stocker ses donnes dans des variables ex : si le code détecte un @ donc il affiche adresse = 0xAb
et si il détecte R il affiche Registre = 0x88
et si il détecte D il affiche DATA = 10101

voici ce que j'ai fait pour l'instant :

char *c;

void loop() {

while (Serial.available()) { 
 *c= Serial.read();
 //Serial.print(*c);

 
  if(*c=='@'){
    
    Serial.println("Adress =");
    *c= Serial.read();
   for(int j=0;j<4;j++){
   
      
          int A = atoi(*c);
         
    Serial.print(A);
    
  }
   }

 else if(*c=='R'){
    Serial.println("");
    Serial.println("Registre =");
for(int i=4;i<8;i++){
       *c= Serial.read();
          int R = atoi(*c);
    Serial.print(R);
   
  }
  }
  
else if(*c=='D'){
       Serial.println("");

   Serial.println("Data =");
   
   for(int k=8;k<16;k++){
       *c= Serial.read();
          int D = atoi(*c);
    Serial.print(D);
  }
}
}

ce que ça m'affiche
Adress =
0000
Registre =
0000
Data =
00000000
que des zeros :confused:

Voici une version qui fait ce que tu veux, mais il faut certainement la travailler si tu n'as pas l'un des caractères recherchés.

char ligne[100];

byte ecouter() {
  static int n = 0;
  if (Serial.available()) {
    // on a au moins 1 octet en attente
    int c = Serial.read(); // on lit la valeur. la fonction read retourne un entier: -1 en cas d'erreur sinon l'octet lu (dans l'octet de poids faible de l'entier)
    if (c != -1) { // s'il n'y a pas eu d'erreur de lecture
//      Serial.print(F("Octet lu: 0x")); Serial.print(c, HEX); // ici c est un entier, on affiche le code ASCII en Hexadécimal
      switch (c) {
        case '\n':
//          Serial.println(F(" caractere: [\\n]"));
          ligne[n] = 0;
          n = 0;
          return 1;
          break;
        case '\r':
//          Serial.println(F(" caractere: [\\r]"));
          break;
        default:
//          Serial.print(F(" caractere: [")); Serial.print((char) c); Serial.println(F("]"));
          ligne[n++] = c;
          break;
      }
    }
  }
  return 0;
}

void chercher() {
  char keys1[] = "@";
  int i1 = strcspn (ligne,keys1);
  char keys2[] = "R";
  int i2 = strcspn (ligne,keys2);
  char keys3[] = "D";
  int i3 = strcspn (ligne,keys3);

  char text[6];
  memcpy(text,ligne+i1+1,4);
  text[4] = 0;
  Serial.print("adresse = ");
  Serial.println(text);
  memcpy(text,ligne+i2+1,4);
  text[4] = 0;
  Serial.print("Registre = ");
  Serial.println(text);
  memcpy(text,ligne+i3+1,5);
  text[5] = 0;
  Serial.print("DATA = ");
  Serial.println(text);
}

void setup() {
  Serial.begin(115200);
  while (!Serial);
  delay(1000);
}

void loop() {
  byte lect = ecouter();
  if (lect) {
//    Serial.println(ligne);
    chercher();
  }
}

(La partie lecture est tirée du tuto de J-M-L)

Sortie :

adresse = 0xAb
Registre = 0x88
DATA = 10101

Ça ne fait qu'afficher, si tu veux sauver dans des variables, il faut utiliser la chaîne text

Merci bcp pour ton aide ! :slight_smile: :slight_smile:

Serial.read(() ne renvoie qu'un seul caractère.
ce que tu as programmé considère qu'il t'en renvoie 4 d'un coup.

récupérer contenu du port serie et le stocker dans des varibales

Un varibale, c'est un cannibale variable ? :sunglasses: