Bonjour,
J'ai un petit problème sous linux avec l'utilisation de la fonction select pour gérer un timeout dans la réception de données via un port série.
En fait je veux pouvoir détecter le fait qu'il n'y a plus de données qui arrivent si t > timeout = 8s par exemple. Mais au lieu de cela, la lecture
s'arrête au bout de 8 secondes...^^ il y a donc quelque chose que j'ai pas saisi...


Voilà le pseudo-code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
 
int port_com;
fd_set read_port_timeout;
struct timeval timeout;
 
//Ouverture du port
	if((port_com = open(nom_COM, O_RDONLY)) < 0){
		//erreur
	}
 
// Gestion des paramètres
	/*Lecture des parametres courants*/
	tcgetattr(port_com, &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;
 
 
// Choix de la parité, Baudrate and co (paramètrage final de type 8N1)
	/*...*/
 
	/*Caracteres immediatement disponibles*/
	termios_p.c_cc[VMIN] = 1;
	termios_p.c_cc[VTIME] = 0;
	/*Sauvegarde des nouveaux parametres*/
	tcsetattr(port_com, TCSANOW, &termios_p);
 
 
 
 
//Mise en place de timeouts
	FD_ZERO(&read_port_timeout);
	FD_SET(port_com, &read_port_timeout);
 
	timeout.tv_sec = 8;
	timeout.tv_usec = 0;
 
// Lecture
while(port_actif){
	retval = select(port_com + 1, &read_port_timeout, NULL, NULL, &timeout);
		if(retval != -1){
			if(read(port_com,&Buff,1) == -1){
				port_actif = 0;
			}
			else{
				/*Traitement*/
			}
		}
	}
}
Voilà, si qqn avait une idée de l'endroit où je m'emmêle les pinceaux...?