Bllocage de la fonction read()

cs_Mayden Messages postés 1 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 13 avril 2005 - 13 avril 2005 à 11:29
DindonOz Messages postés 8 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 14 mai 2005 - 14 avril 2005 à 14:05
je viens de réaliser une application en cpp sous linux, permettant de communiquer avec une station météo. mais par moment je perd la connexion avec celle-ci. à ce moment, la fonction read ce bloque. normalement la fonction doit me renvoyer un code. mais la rien et le programme ce bloque.
si quelqu'un avait la solution cela m'aiderais beaucoup.
merci d'avance.

8 réponses

piemouce Messages postés 3 Date d'inscription lundi 1 septembre 2003 Statut Membre Dernière intervention 14 avril 2005
13 avril 2005 à 13:49
Salut...



Comment ouvres-tu la connexion?

Il y a des option d'ouverture te permettant de

ne pas rendre la fonction read bloquante....



Piemouce
0
DindonOz Messages postés 8 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 14 mai 2005
13 avril 2005 à 15:32
pour ouvrir la connexion j'utilise les fonction non-ansi classique.

voici ma commande d'ouverture :

ws2300 = open(device, O_RDWR | O_NOCTTY) ;
0
piemouce Messages postés 3 Date d'inscription lundi 1 septembre 2003 Statut Membre Dernière intervention 14 avril 2005
13 avril 2005 à 16:17
RE...



Voila rajoute l'option O_NDELAY à l'ouverture....

Cela devrai palier à ton problème.

Par contre il va falloir que tu geres une boucle avec un timeout

si tu attents des données sur la connexion...



desc=open(device,O_RDWR|O_NDELAY|O_NOCTTY);
0
cobbleguard Messages postés 6 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 20 avril 2006
13 avril 2005 à 17:04
Et la communication se fait comment? par tube ou shared memory? si c par tube, c'est que le tube n'est pas ouvert de l'autre cote, si c par shared memory--> prob de synchro, regarde tes semaphores
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DindonOz Messages postés 8 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 14 mai 2005
13 avril 2005 à 19:25
merci piemouce. je vais tester ceci de suite.
sinon la communication se fait par tube. et c'est vrai qu'il ce peut que le tube ne soit pas ouvert de l'autre coté car d'apres ce que j'ai compris, la station météo fonctionne par IRQ et l'orsqu'elle interroge les capteurs, celle-ci coupe la communication. mais c a vérifier. en tout cas merci. je vais tester et je vous tient au courant
0
DindonOz Messages postés 8 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 14 mai 2005
14 avril 2005 à 11:40
je viens de faire quelque recherche sur le timeout() mais je n'ai
forcement bien compris comment sa fonctionnait et comment le mettre en
oeuvre. pouriez vous m'aider svp.
0
piemouce Messages postés 3 Date d'inscription lundi 1 septembre 2003 Statut Membre Dernière intervention 14 avril 2005
14 avril 2005 à 11:54
Salut...



Tu peux tester comme ca avec TIME_OUT_LECTURE une constante que tu dois
définir suivant tes besoins (en seconde), a toi de voir aussi ta
condition de sortie. Ici c'est sur un nombre reçu de caractères mais tu
peux tester aussi avec un caractères de contrôle par exemple.



time_deb = time(NULL);



nblu = 0;

do

{

iCommLength = read(desc,buffer + nblu,longueur - nblu);



if(iCommLength > 0)

nblu += iCommLength;

} while(nblu < longueur && ((time(NULL) - time_deb)<=(TIME_OUT_LECTURE)));
0
DindonOz Messages postés 8 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 14 mai 2005
14 avril 2005 à 14:05
merci. je vais tester et je te tient au courant.
0
Rejoignez-nous