|
/***********************************************************************/
|
|
/* */
|
|
/* 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;
|
|
}
|
|
|
|
|
|
|
|
|