Projet

Général

Profil

« Précédent | Suivant » 

Révision 885

Ajouté par Pape Demba AMAR il y a environ 4 ans

fin de séance SP4C3

Voir les différences:

branch/AMAR/sp4c12/uart0/uart0/uart0.c
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
/***********************************************************************/
#include "sfr32c87.h"
void uart0_init(void)
{
{
......
caractere_recu = uart0_rx();
/**detection trame**/
while ( caractere_recu != '$')
while ( caractere_recu!= '$')
{
i = 0;
checksum = 0;
......
Buffer[i++] = caractere_recu;
checksum = checksum ^ caractere_recu;
}
return i;
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;
}

Formats disponibles : Unified diff