Bonjour,
Je rencontre un problème, avec l'utilisation de la fonction select(), pour situer un peu le problème, je souhaite utiliser cette fonction afin que mon "read" ne soit plus bloquante et qu'en cas de non réception de données le programme ne bloque pas sur ce fameux read. Je suis donc tombé sur la fonction select() et après avoir regardé pas mal de documentations dessus, je me suis lancé, mais malheureusement sans grand succès.
A l'heure actuelle, aucune erreur à la compilation le seul problème est que la fonction reste bloquée sur le cas ou le délai est dépassé alors que je reçois bien quelque chose.
Code:#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <time.h> #include <sys/time.h> #include <time.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/select.h> #define OFFSET 47700 int main(void) { int port_serie=0; int reception=0; int i=0, calcul=0,rc=0,rv; char buffer[36] = ""; char verif[7] =""; struct timeval times; struct timezone timezs; struct timeval timeg; struct timezone timezg; struct termios options; fd_set set; FD_ZERO(&set); /* clear the set */ FD_SET(port_serie, &set); /* add our file descriptor to the set */ struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; time_t timestamp = time(NULL); // Paramètres concernant la zone géographique. On n'y touche pas. timezs.tz_minuteswest=0; timezs.tz_dsttime=0; // lecture et ecriture | pas controlling terminal | ne pas attendre DCD port_serie = open("/dev/ttySP4", O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY); if(port_serie < 0 ) //cas d'erreur d'ouverture { perror("Erreur d'ouverture du port serie, veuillez verifier que l'antenne est bien branché :"); exit(-1); } else // cas ouverture réussie { tcgetattr(port_serie, &options);//chargement des données cfsetospeed(&options, B4800);//B4800 bauds options.c_cflag |= (CLOCAL | CREAD);//programme propriétaire du port // structure en 8N1 !! options.c_cflag &= ~PARENB; //pas de parité options.c_cflag &= ~CSTOPB; // 1 bit de stop options.c_cflag &= ~CSIZE; //option a 0 options.c_cflag |= CS8; //8 bits tcsetattr(port_serie, TCSANOW, &options); //enregistrement des valeurs de configuration du port serie 1 printf("Configuration OK strcuture en 8N1 !. \n"); do { calcul =0; //On réinitialise la variable qui sert à calculer le checksum tcflush(port_serie,TCIFLUSH);// On vide à chaque fois le buffer du port série en entrée fcntl(port_serie,F_SETFL,10); //La fonction read est en mode bloquant. On attend tant qu'on ne reçoit pas de caractères. rv = select(port_serie +1, &set,NULL,NULL, &timeout); if(rv == -1) perror("select"); /* an error accured */ else if(rv == 0) printf("timeout"); /* a timeout occured */ else { reception=read(port_serie,buffer,34);// On vient lire 34 octets placés dans le buffer provenant du port série. } }while(1); } close(port_serie); return 0; }
Quelqu'un aurait-il une idée .?
Merci d'avance
-----