|
/***********************************************************************/
|
|
/* */
|
|
/* FILE :SP4b1.c */
|
|
/* DATE :Wed, Jun 02, 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 "sfr32c87.h"
|
|
|
|
void uart0_init(void); // Initialisation du port s?rie
|
|
void uart0_tx(char c); //Envoie d'un caract?re
|
|
char uart0_rx(void); //Fonction d'attente et lecture d'un caract?re
|
|
int rectramev1(char * Buffer);
|
|
int rectramev2(char * Buffer);
|
|
void irectramev1(char * Buffer);
|
|
int hex2int(char *c); //Passage hexa en int
|
|
|
|
/*Variable Globale*/
|
|
int trame_ok;
|
|
int Etat = 0; //0->synchronisation, 1->reception, 2->checksum, 3->validation
|
|
|
|
void main(void)
|
|
{
|
|
char Buffer[80];
|
|
|
|
uart0_init();
|
|
while(1){
|
|
uart0_tx(rectramev1(Buffer)+48);
|
|
if (trame_ok == 1){
|
|
uart0_tx('O');
|
|
uart0_tx('K');
|
|
}
|
|
else{
|
|
uart0_tx('N');
|
|
uart0_tx('O');
|
|
uart0_tx('N');
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void uart0_init(void){
|
|
u0mr = 0x05;
|
|
u0brg = 32;
|
|
u0c0 = 0x11;
|
|
u0c1 = 0x05;
|
|
pd6_0 = 0;
|
|
pd6_1 = 0;
|
|
pd6_2 = 0;
|
|
pd6_3 = 1; //On affecte seulement les bits que l'on a besoin pour le bon fonctionnement
|
|
ps0_3 = 1;
|
|
}
|
|
|
|
void uart0_tx(char c){
|
|
while (ti_u0c1 != 1);
|
|
u0tb = c;
|
|
}
|
|
|
|
char uart0_rx(void){
|
|
while (ri_u0c1 != 1);
|
|
return u0rb;
|
|
}
|
|
|
|
int rectramev1(char * Buffer){
|
|
int i;
|
|
char checksum;
|
|
char carac_recu;
|
|
char checksum_trame[3];
|
|
|
|
|
|
while (uart0_rx() != '$');
|
|
i = 0;
|
|
checksum = 0; //'0'
|
|
while ((carac_recu = uart0_rx()) != '*'){
|
|
|
|
Buffer[i++] = carac_recu;
|
|
checksum = checksum ^ carac_recu; // ^ est le ou exclusif
|
|
}
|
|
|
|
checksum_trame[0] = uart0_rx();
|
|
checksum_trame[1] = uart0_rx();
|
|
|
|
if (checksum == hex2int(checksum_trame)){
|
|
trame_ok = 1;
|
|
}
|
|
else{
|
|
trame_ok = 0;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
/*int rectramev2(char * Buffer){
|
|
int i;
|
|
char c;
|
|
while(1){
|
|
c = u0rb;
|
|
if (c == '&'){
|
|
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}*/
|
|
|
|
void irectramev1(char * Buffer){
|
|
int i;
|
|
char c;
|
|
char checksum_trame;
|
|
while(1){
|
|
|
|
c = uart0_rx();
|
|
switch(Etat){
|
|
|
|
case 0 : //Synchro
|
|
|
|
if (c == '$'){
|
|
|
|
i = 0;
|
|
checksum_trame = 0;
|
|
Etat = 1;
|
|
}
|
|
|
|
case 1 : //Reception
|
|
|
|
if (c != '*'){
|
|
|
|
Buffer[i++] = c;
|
|
checksum_trame ^= c;
|
|
|
|
}
|
|
else{
|
|
|
|
Etat = 2;
|
|
}
|
|
|
|
case 2 : //checksum
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
int hex2int(char *c)
|
|
{
|
|
int i=0;
|
|
|
|
for(i=0; i<2; i++)
|
|
{
|
|
if(c[i]>='0' && c[i]<='9')
|
|
{
|
|
c[i] = c[i] - '0';
|
|
}
|
|
|
|
if(c[i]>='A' && c[i]<='F')
|
|
{
|
|
c[i] = c[i] - 'A' + 10;
|
|
}
|
|
}
|
|
return(c[1]+16*c[0]);
|
|
}
|
|
/*
|
|
typedef enum{synchronisation , reception , checksum , validation}etat_machine;
|
|
etat_machine etat=synchronisation;
|
|
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
*/
|