Aduino uno-Serial.available()

Bonjour,

CONTEXTE :
Ceci est un moyen d'authentification pour un agent secret, il doit rentré dans un premier temps une lettre qui lui est attribué (de A à Q mais sans le G). Par la suite le programme va lui renvoyé un nombre crypté (en lien avec le "m random"). Ensuite via un site externe, il obtient le nombre "m" et l'inscrit dans le monitor, si le nombre inscrit est le bon, alors il est authentifié, sinon non.

Dans mon programme je souhaites attendre une première saisi dans mon Monitor (ici une lettre a,b,c,...) qui me donne un nombre (ici "c"), par la suite, via un site externe, je dois saisir un autre nombre, donc une 2ème saisi dans le moniteur. Dans mon programme je laisse un delay(20000) mais je ne souhaite pas y recourir, car en théorie il est censé rentré dans la boucle " if(Serial.available())" lorsque je rentre ma 2ème saisi.

En clair, je souhaite mettre à la suite 2 "if(Serial.available())" or le 2ème n'attend pas la 2ème saisi dans mon monitor.
Merci d'avance.

Désolé pour le long programme, je ne sais pas comment le mettre en mode Code. Pour bien le différencier du texte.

char x;
bool V = false;  // me permet de passer à l'autre Serial.available() de la 2eme saisi

int chiffrer(int m, int e);
int clefagent(char x);
int Modexp(int a, int e, int n);

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(90)); // 90 un pin analogique non utilisé (juste pour que 
                                                         //j'ai bien un nombre random, car random() n'est pas 
                                                         //si random que ca...)
}

void loop() {
  int e, mp, c;
  short m;  // ou int ou lon peut import
  char x;
  Serial.println(" ");
  Serial.println(" ");
  Serial.println("Identifiez-vous");

  while(V==false){
  if(Serial.available()){   // 1ER Serial.available()
  x = Serial.read();
  Serial.println(x);
  m = random(0, 2881);
  e = clefagent(x);
  c = chiffrer(m ,e);
  Serial.print("Message à dechiffrer :");
  Serial.println(c);
  V=true;
  delay(1000);
}
  }
  while(V==true){
if(Serial.available()){      // 2EME Serial.available
  mp=Serial.parseInt();
  if (m==mp){
    Serial.print("Vous etes authentifie ! Bienvenue agent ");
    Serial.println(x);
    delay(1000);
    exit(0);
  }
  else{
    Serial.println("Erreur d'authentification, le systeme de securité se déclenchera dans 5 secondes");
    delay(1000);
    exit(0);
  }
}
}
}
int Modexp(int m, int e, int n){
  unsigned long r;  // On a besoin d'une grosse mémoire car les calculs de R peuvent aller jusque 5 millions
  if(e<=0){
    Serial.println("unhandled case");
    exit(0);
  }
  if(m==0 || n==1){
    r=0;
  }
  else{
    r=1;
    while(e>0){
      r = (r*m) % n ;
      e--;
    }
  }
  return r;
}

///// CHIFFRER /////
int chiffrer(int m, int e){
  int c;
  int n= 2881;
  c = Modexp(m, e, n);

  return c;
}

///// ClefS Publique Des AGENTS /////
int clefagent(char x){
  char a=65;
  char b=66;
  char c=67;
  char d=68;
  char e1=69;
  char f=70;
  char h=72;
  char i=73;
  char j=74;
  char k=75;
  char l=76;
  char m=77;
  char n=78;
  char o=79;
  char p=80;
  char q=81;  
  int e;
  if(x==a){
    e=601;
  }
  if(x==b){
    e=619;
  }
  if(x==c){
    e=631;
  }
  if(x==d){
    e=641;
  }
  if(x==e1){
    e=647;
  }
  if(x==f){
    e=653;
  }
  if(x==h){
    e=661;
  }
  if(x==i){
    e=673;
  }
  if(x==j){
    e=691;
  }
  if(x==k){
    e=701;
  }
  if(x==l){
    e=733;
  }
  if(x==m){
    e=739;
  }
  if(x==n){
    e=751;
  }
  if(x==o){
    e=797;
  }
  if(x==p){
    e=809;
  }
  if(x==q){
    e=811;
  }
  return e;
}

Quand on utilise la console, on peut choisir entre
pas de fin de ligne
Retour chariot
nouvelle ligne
CR et LF
Si on ne choisit pas le premier, quand on envoie un caractère, on envoie aussi un deuxième caractère (CR et/ou LF)

Note:
char a=65;
peut aussi s'écrire
char a='A';
et

char a=65;
if(x==a)...

peut aussi s'écrire
if (x == 'A') ...

C'est le paragraphe "La balise de code :" de la page

qui n'est pas claire? On peut rééditer le post pour corriger ceci.

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