1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #include <termios.h> /* port série */
#include <sys/types.h> /* socket */
#include <sys/socket.h> /* socket */
#include <netinet/in.h> /* socket */
#include <arpa/inet.h> /* socket */
#include <netdb.h> /* socket */
#include <sys/fcntl.h> /* open() */
#include <unistd.h> /* close() */
#include <stdio.h> /* lib standard */
#define IP_SERVEUR "10.57.70.2"
#define PORT_SERVEUR 1500
#define PORT "/dev/ttyS0"
#define NUM_SITE "1"
#define NUM_TERM "1"
#define FALSE 0
#define TRUE 1
int main () {
int stop=FALSE;
int fd;
int i,j,num_int,somme,CRC_calc,CRC_lu;
char recup_port[30],num_str[30];
char c;
struct termios termios_p;
/* Ouverture de la liaison série */
fd = open(PORT, O_RDWR | O_NOCTTY);
if (fd <0) {perror(PORT); exit(-1); }
/********************* Configuration du port serie *********************/
/* Lecture des parametres courants */ //
tcgetattr(fd,&termios_p); //
/* On ignore les BREAK et les caracteres avec erreurs de parite */ //
termios_p.c_iflag = IGNBRK | IGNPAR; //
/* Pas de mode de sortie particulier */ //
termios_p.c_oflag = 0; //
/* Liaison a 9600 bps avec 8 bits de donnees et une parite paire */ //
termios_p.c_cflag = B9600 | CS8 | CLOCAL | CREAD; //
/* Mode non-canonique avec echo */ //
termios_p.c_lflag = ECHO; //
/* Caractères immediatement disponibles */ //
termios_p.c_cc[VMIN] = 1; //
termios_p.c_cc[VTIME] = 0; //
/* Sauvegarde des nouveaux parametres */ //
tcsetattr(fd,TCSANOW,&termios_p); //
/***************************************************************************/
/* Boucle de lecture du port */
while(stop==FALSE){
/* Vide le buffer */
tcflush(fd, TCIFLUSH);
/* Initialise le caractère et le compteur de caractère */
c='\0';
i=0;
while((c!=0x0a) & (stop==FALSE)){
/* Récupère un caractère */
read(fd, &c, 1);
printf("%c\n",c);
/* Concatène le caractère dans le string recup_port */
recup_port[i]=c;
i++;
if (i>sizeof(recup_port)-1){
printf("Erreur de lecture carte : trop de caractère\n");
stop=TRUE;
}
}
if (!stop){
/* Ajoute le 0 de fin de chaîne */
recup_port[i]=0;
/* Récupère le numéro de carte au format entier */
strncpy(num_str,recup_port,i-3);
num_int=atoi(num_str);
printf("Numéro de carte = %d\n",num_int);
/************************* Clé de Contrôle *************************/
/* Lecture de la clé de contrôle */ //
CRC_lu=recup_port[i-3]-'0'; //
printf("CRC lu = %d\n",CRC_lu); //
//
/* Calcul de la clé de contrôle */ //
somme=0; //
for(j=0;j<i-3;j++){ //
somme+=recup_port[j]-'0'; //
} //
CRC_calc=10-(somme % 10); //
printf("CRC calc = %d\n",CRC_calc); //
//
/* Vérification de la clé de contrôle */ //
if (CRC_calc!=CRC_lu){ //
printf("Erreur de lecture carte : clé de contrôle invalide\n"); //
break; //
} //
else{ //
printf("CRC vérifié\n"); //
} //
/*********************************************************************/
/* Tempo : évite d'endormir le programme de lecture sur la même carte */
sleep(2);
}
}
/* Fermeture de la liaion serie */
close(fd);
return 0;
} |
Partager