problème select()
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

problème select()



  1. #1
    invite0bde6d7c

    problème select()


    ------

    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

    -----

  2. #2
    invite0bde6d7c

    Re : problème select()

    EDIT :

    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 je lis bien les 4 premières secondes puis je passe en "Timeout" alors que je reçois toujours bien quelque chose.
    La seule chose que je veux, en gros, c'est que seulement si je ne reçois rien pendant 5 secondes alors la je passe dans la boucle timeout.
    Mais peut-être ai-je mal compris le principe de la fonction select()...


    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
    Dernière modification par JPL ; 21/05/2013 à 17h56. Motif: Correction du titre

Discussions similaires

  1. problème avec select() en c
    Par invite6ae216d1 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 17/08/2011, 07h58
  2. Problème utilisation WITH SELECT en VHDL
    Par thundertom dans le forum Électronique
    Réponses: 4
    Dernier message: 16/03/2011, 21h44
  3. Problème affichage NEC I-Select M4610
    Par invite9fae838f dans le forum Matériel - Hardware
    Réponses: 4
    Dernier message: 16/10/2010, 17h21
  4. Problème avec la requete SELECT et UPDATE
    Par invite7e9df035 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 10
    Dernier message: 23/01/2009, 15h07
  5. [Brun] télécommande select 5 bc-9950
    Par invite3c90a0e8 dans le forum Dépannage
    Réponses: 0
    Dernier message: 26/02/2007, 12h48