Arduino mega, 2 port série

Bonjour,

Voici mon programme: Serial : Transmet RX et TX entre 2 Xbee. Serial1: Lit les données sur RX d'une board RFID.

Le problème: Lorsque le lecteur RFID détecte une carte pour la première fois, il achemine bien les données au Xbee, qui le transmet bien à l'autre Xbee qui est connecté sur mon PC.
Seule chose, lors de la 2e, 3e, 4e, 5e etc fois, chaque foid que le lecteur RFID détecte une carte (Serial1.available), celà fais planté la communication et je ne lis pas le bon résultat du Serial1.

Il faut donc que je ''reset'' mon programme, et le tout fonctionne bien encore pour une fois.

Alors, qu'est-ce que je ne fais de correct avec les 2 boucle Serial.availble et Serial1.available???

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(led, OUTPUT);
  
  
}

void loop()
{
  
  //delay(1);
  led_status();
  //get_up_time(); 
 
    
  switch(RxSerialState)
  {
      case 0:                     //  Check for Start Delimiter
        if(RxBuffer[0]== 0x7E){
          RxSerialState=1;
          RxXsum=0x00;
          ValidMsgRxied=0;
          RxError=0;               
        }
        else 
          RxSerialState=0;         
        break;   
    
      case 1:                     // Read Byte Count High               
        RxSerialState=2;
        break;
    
      case 2:                     // Read Byte Count Low   
        RxByteCount = RxBuffer[2];         
        if ( (RxByteCount < 30) || (RxByteCount > 0) )
          RxSerialState=3;
        else
          RxSerialState=0;
        break;
    
      case 3:                     // Read API ID
        RxXsum = RxXsum + RxBuffer[3];
        p=4;   
        RxByteCount--;
        if ( RxBuffer[3] == 0x81){           // API Type=0x81 sur XBEE;
           RxSerialState=4;
        }
        else
           RxSerialState=0;
        break;
    
      case 4:                     // Read Data
        RxXsum=RxXsum+RxBuffer[p];
        p++;
        if (RxByteCount == 0)
        {
          RxSerialState=5;
          RxXsum=255-RxXsum;
        }
        RxByteCount--;
        break;
    
      case 5:                     // Read XSUM
        //if ( (RxXsum==RxBuffer[p]) && (RxByteCount == 0) )
        //{
        ValidMsgRxied=1;
        RxSerialState=0;
        //}
        //else 
        //   RxError=1;
        break;
      }   // end switch





  if(ValidMsgRxied == 1){
      //if (event == 1){
        //digitalWrite(led, HIGH);
            
        TxBuffer[0] = 0x7E;
        
        TxBuffer[2] = 0x18;
        TxBuffer[3] = 0x01;
        TxBuffer[4] = 0x00;
        TxBuffer[5] = 0x00;
        TxBuffer[6] = 0x01;
        TxBuffer[7] = 0x01;
        TxBuffer[8] = 0x22;//START
        TxBuffer[9] = RxBuffer_2[0];
        TxBuffer[10] = RxBuffer_2[1];
        TxBuffer[11] = RxBuffer_2[2];
        TxBuffer[12] = RxBuffer_2[3];
        TxBuffer[13] = RxBuffer_2[4];
        TxBuffer[14] = RxBuffer_2[5];
        TxBuffer[15] = RxBuffer_2[6];
        TxBuffer[16] = RxBuffer_2[7];
        TxBuffer[17] = RxBuffer_2[8];
        TxBuffer[18] = RxBuffer_2[9];
      
        TxBuffer[19] = RxBuffer_2[10];
        
        TxBuffer[20] = RxBuffer_2[11];
        TxBuffer[21] = RxBuffer_2[12];
        TxBuffer[22] = 0x00;
        TxBuffer[23] = 0x00;
        TxBuffer[24] = 0x00;
        TxBuffer[25] = 0x00;
        TxBuffer[26] = 0x00;
          
          
        TxXsum2 = 0;
        for(p=3; p <= 26; p++){
           TxXsum2 += TxBuffer[p];
        }
        TxXsum = 0xFF - TxXsum2;
        
        TxBuffer[27] = TxXsum;
    
        Serial.write(TxBuffer,sizeof(TxBuffer));
        
        event = 0;
        //serialCount = 0;
        //serialCount_2 = 0 ;
        ValidMsgRxied=0;
        RxBuffer[0] = 0x00;
        //RxBuffer_2[0] = 0x00;
    
        for(k=0; k <= 19; k++){ //Clear le RxBuffer
          RxBuffer_2[k] = 0x00;
        }
        for(k=0; k <= 26; k++){ //Clear le TxBuffer
          TxBuffer[k] = 0x00;
        }
        
    //}//END event = 1
         
               
  }//END vail message received
}//END LOOP


void serialEvent1() {
  
  if(Serial1.available()>=13) {
    //serialCount_2 = 0 ;
    event = 1;

    for(j=0; j <= 12; j++){

      //digitalWrite(led, HIGH);
      RxBuffer_2[j] = Serial1.read();
      //serialCount_2++;
      //digitalWrite(led, LOW);


    }//END FOR
  }//END IF 
}//END function 


void serialEvent() {
  
  if(Serial.available()>=15) {
    serialCount = 0 ;

    for(int n=0; n <= 14; n++){
      
      //digitalWrite(led, HIGH);
      RxBuffer[n] = Serial.read();
      serialCount++;
      //digitalWrite(led, LOW);
      

    } 
  } 
}

void led_status(){

  sys_status++;
   

  if (sys_status <=15000){
    digitalWrite(led, LOW);
  }
  if (sys_status >15000){
    digitalWrite(led, HIGH);
  }
  if (sys_status >=30000){
    sys_status = 0;
    digitalWrite(led, LOW);
  }


}

Je serais tenté de dire que la gestion des données reçues dans le serialEvent n'est pas sûre. Cette routine est appelée à la fin de loop et présuppose que tu reçois 13 caractères. Si jamais il y en a 12 ou 14 la routine fait n'importe quoi.Tout se décale est ne revient plus en phase.

En fait je dirais que, dans son l'ensemble, le programme est trop rigide est ne laisse pas place à une possible erreur de réception.
En particulier dans serialEvent , il faudrait gérer les caractères un par un au rythme ou ils arrivent et laisser à la fonction la tâche de reconnaître le caractère d'entête et la réinitialisation du pointeur dans le tampon de réception ainsi que la détection du terminateur de chaîne qui lèverait un drapeau pour signaler à la boucle principale que le tampon est prêt à être traité. Attention aussi, si le traitement du tampon de réception est trop long il risque d'être écrasé par l'arrivé de nouvelles données. Dans ce cas il faudrait avoir 2 tampons de réception en flip-flop.