Index: branch/AMAR/sp4c12/uart0/uart0/uart0.c
===================================================================
--- branch/AMAR/sp4c12/uart0/uart0/uart0.c	(revision 884)
+++ branch/AMAR/sp4c12/uart0/uart0/uart0.c	(revision 885)
@@ -9,7 +9,6 @@
 /*  NOTE:THIS IS A TYPICAL EXAMPLE.                                    */
 /***********************************************************************/
 	#include "sfr32c87.h"
-	
 void uart0_init(void)
 {
 {
@@ -95,7 +94,7 @@
     caractere_recu = uart0_rx();
     /**detection trame**/
 
-   while ( caractere_recu != '$')
+   while ( caractere_recu!= '$')
 {
         i = 0;
 		checksum = 0;
@@ -108,4 +107,137 @@
       Buffer[i++] = caractere_recu;
       checksum = checksum ^ caractere_recu;
 }
-   return i;
\ No newline at end of file
+ return i ;
+ 
+}
+#include <stdio.h>
+#include <stdlib.h>
+
+typedef enum{synchronisation , reception , checksum , validation}etat_machine;
+etat_machine etat=synchronisation;
+
+/**variables globales**/
+/**trame1 correct**/
+char trame1[] = {'$','G','P','G','G','A',',','0','6','4','0','3','6','.','2','8','9',',','4','8','3','6','.','5','3','7','5',',','N',',','0','0','7','4','0','.','9','3','7','3',',','E',',','1',',','0','4',',','3','.','2',',','2','0','0','.','2',',','M',',',',',',',',','0','0','0','0','*','0','E'};
+
+/**trame2 incorrect**/
+char trame2[]= {'$','G','P','G','G','A',',','1','4','1','9','1','4','.','0','0',',','4','5','4','5','.','0','0','0','0',',','N',',','0','0','3','0','6','.','6','0','3','6',',','E',',','1',',','0','5',',','3','.','4',',','4','9','9','.','3',',','M',',',',','M',',',',','*','7','D'};
+
+int hex_int(char *c)
+{
+	int i=0;
+
+       	 /**La boucle permet de travaller sur les deux derniers 
+	       caractères du checksum de la trame reçue**/
+		
+	for(i=0; i<2; i++)
+	{
+	   	 /**si le caractere est entre 0 et 9 ->retranche en ascii '0', soit 48 en décimal**/
+		if(c[i]>='0' && c[i]<='9')
+		{
+			c[i] = c[i]-48;
+		}
+		
+		/**si le caractere est superieur a 10, soit A en hex ->retranche le nombre 55**/
+		if(c[i]>='A')
+		{
+			c[i] = c[i]-55;
+		}
+	}
+
+	/*passage hexa en decimal**/
+	return( c[1]+16*c[0] );
+}
+
+int RecTrame(char*Buffer)
+{
+	//declaration des variables
+	int nombre_caractere_apres_etoile=0;
+	int k=0; //pour le test
+	int nombre_cararactere=0;
+	char caractere_recu;
+	char checksum_trame=0;
+	char checksum_fin_trame[3];
+	char checksum_calculer=0;
+
+	while(1)
+	{
+		//caractere_recu = uart0_rx();
+		caractere_recu = trame1[k];
+		k++;
+
+		switch(etat)
+		{
+			case synchronisation :
+					if(caractere_recu == '$')
+					{
+						nombre_cararactere = 0;
+						etat=reception;
+						checksum_trame = 0;
+					}
+					break;
+
+			case reception :
+				if(caractere_recu != '*')
+				{
+				    /**placement du caractere recu de la trame dans le Buffer**/
+					Buffer[nombre_cararactere] = caractere_recu;
+					nombre_cararactere++;
+				/**verification du checksum à chaque caractere recu**/
+					checksum_trame ^= caractere_recu;
+					nombre_caractere_apres_etoile = 0;
+				}
+				else
+				{
+				    /**passage à l'etat cheksum quand la trame est memorisée**/
+					etat = checksum;
+				}
+				break;
+
+			case checksum :
+		                            /**récupération du checksum de la trame (2derniers caractères)**/
+			checksum_fin_trame[nombre_caractere_apres_etoile] = caractere_recu;
+
+                            			/**attention, on mémorise deux caractères
+		                                donc, premier caractère -> nombre_caractere_apres_etoile=0
+                             		              deuxième caractère -> nombre_caractere_apres_etoile=1
+		                                soit deux caractères mémorisés après la virgule**/
+
+				if(nombre_caractere_apres_etoile == 2)
+				{
+					    etat = validation;
+					checksum_calculer = hex_int(checksum_fin_trame);
+				}
+
+				nombre_caractere_apres_etoile++;
+				break;
+
+			case validation :
+		                            /**comparaison du checksum_trame et checksum_calculer
+                            				si l'égalité est vérifiée alors on retourne le nombre
+		                            de caractère de la trame, sinon on retourne la valeur 0**/
+
+				if(checksum_trame == checksum_calculer)
+				{
+					etat = synchronisation;
+					return nombre_cararactere;
+				}
+				else
+				{
+					etat = synchronisation;
+					return 0;
+				}
+				break;
+		}
+	}
+}
+
+int main(void)
+{
+    char Buffer[80];
+
+    printf("\nnombre de caractere : %d\n", RecTrame(Buffer));
+
+    return 0;
+}
+
