Projet

Général

Profil

/***********************************************************************/
/* */
/* FILE :SP4c2.c */
/* DATE :Mon, Jun 07, 2021 */
/* DESCRIPTION :main program file. */
/* CPU GROUP :87B */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.18). */
/* NOTE:THIS IS A TYPICAL EXAMPLE. */
/***********************************************************************/


#include<stdio.h>
#include<stdlib.h>
#include"sfr32c87.h"

typedef enum{synchronisation, reception, checksum, validation} etat_machine;
etat_machine etat=synchronisation;



void uart0_init(void)
{
u0mr = 0x05;
u0brg = 0x20;
u0c0 = 0x11;
u0c1 = 0x05;
pd6 = 0x08;
ps0 = 0x08;
}
void uart0_tx(char c)
{
while(ti_u0c1 !=1);
u0tb=c;
}


char uart0_rx()
{
while(ri_u0c1!=1);
return u0rb;
}



int Rectrame(char *Buffer)
{
int i = 0;
char caractere_recu;
char checksum = '0';
/**lecture du caractere recu**/
caractere_recu = uart0_rx();

/**detection trame**/
while ( caractere_recu != '$')
{
i = 0;
checksum = 0;
}
/**memorisation de la trame re?ue**/
while ( caractere_recu != '*')
{
caractere_recu = uart0_rx();
Buffer[i++] = caractere_recu;
checksum = checksum ^ caractere_recu;
}
return i ;
}




/**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){
int k=0;
int nombre_caractere_apres_etoile=0;
int nombre_caractere=0;
char caractere_recu;
char checksum_trame=0;
char checksum_fin_trame[];
char checksum_calculer=0;
while(1)
{
if (caractere_recu == '$'){
nombre_caractere = 0;
etat=reception;
checksum_trame=0;
}
break;
if (caractere_recu !='*'){
Buffer[nombre_caractere] = caractere_recu;
nombre_caractere++;
checksum_trame ^= caractere_recu;
nombre_caractere_apres_etoile = 0;
}
else
{
etat =checksum;
}
break;
if (nombre_caractere_apres_etoile==2){
etat=validation;
checksum_calculer=hex_int(checksum_fin_trame);
}
nombre_caractere_apres_etoile++;
break;
if (checksum_trame==checksum_calculer){
etat = synchronisation;
return nombre_caractere;
}
else
{
etat = synchronisation;
return 0;
}
break;
}
}








/**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_int1(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;
}
}
/**entier_cheksum= c[1] + 16*c[0]**/
return( c[1]+16*c[0] );
}





int rectrame(char *Buffer, char *trame)
{
int nombre_caractere_apres_etoile=0;
int k=0;
int nombre_cararactere=0;
char caractere_recu;
char checksum_trame=0;
char checksum_fin_trame[3];



char checksum_calculer=0;
/**lecture du caractere recu**/
//caractere_recu = uart0_rx();
caractere_recu = trame[k];
/**detection trame**/
while( caractere_recu != '$')
{
//caractere_recu = uart0_rx();
caractere_recu = trame[k];
}
k++;
nombre_cararactere = 0;
checksum_trame = 0;
/**memorisation de la trame recue**/
while(caractere_recu != '*')
{
//caractere_recu = uart0_rx();
caractere_recu = trame[k];
k++;
Buffer[nombre_cararactere] = caractere_recu;
if(caractere_recu != '*')
{
nombre_cararactere++;
checksum_trame ^= caractere_recu;
}
}
while(nombre_caractere_apres_etoile != 3)
{
//caractere_recu = uart0_rx();
caractere_recu = trame[k];
k++;
checksum_fin_trame[nombre_caractere_apres_etoile] = caractere_recu;
if(nombre_caractere_apres_etoile == 2)
checksum_calculer = hex_int(checksum_fin_trame);
nombre_caractere_apres_etoile++;
}
if(checksum_trame == checksum_calculer)
return nombre_cararactere;
else
return 0;
}



int main(void)
{
char Buffer[80];
printf("trame valide :\nnombre de caractere : %d\n", rectrame(Buffer, trame1));
printf("trame erronee\nnombre de caractere : %d\n", rectrame(Buffer, trame2));
return 0;
}




(2-2/9)