Révision 885
Ajouté par Pape Demba AMAR il y a environ 4 ans
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
fin de séance SP4C3