Bonjour à tous,
Voilà je viens de développer un prog pour linux qui me permet de lire le en mode non canonique caractère par caractère le contenu de mon port série. (sur le port série et brancher un lecteur de carte à puce est le but et de récupérer le numéro des cartes qui se badge).
le programme tourne, ca marche nickel. mais j'aimerai bien maintenant ajouter une gestion de timeout. pour cela j'ai du mal a m'orienter. il faut je crois utiliser le VTIME du termios et bricoler avec le retour du read() mais je ne sais pas vraiment comment mi prendre. Sachant que entre chaque carctère on va dire qu'il ne faut pas dépasser 5 ms par exemple.
Et autre chose je cherche également a pouvoir stopper le programme par l'appui sur une touche du clavier, sans avoir a valider celle-ci comme avec getchar(). Je crois savoir que kbhit() fait ca sous windows mais ne fonctionne pas sous linux.
Merci d'avance.
Voici mon code :
[code]#include <termios.h> /* port série */
#include <sys/fcntl.h> /* open() */
#include <unistd.h> /* close() */
#include <stdio.h> /* lib standard */
#define PORT "/dev/ttyS0"
#define FALSE 0
#define TRUE 1
int main () {
int stop=FALSE;
int fd;
int i,j,num_int;
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] = 1; //
/* 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);
/* Tempo : évite d'endormir le programme de lecture sur la même carte */
sleep(2);
}
}
/* Fermeture de la liaion serie */
close(fd);
return 0;
}
[/code]