Probleme utilisation de la méthode read

Motta_42
Probleme utilisation de la méthode read

Bonjour,

J'ai un projet a réaliser, je doit faire un programme qui tourne en boucle sur un PC relié a une centrale de température, la liaison est une RS485 et je travaille sous linux en c++. Je réussi a envoyer mes commandes grâce a la méthode write mais je n'arrive pas a lire la réponse de la centrale, pour cela j'utilise la méthode read mais elle me retourne l'erreur eagain continue dans errno, j'ai vérifier la connexion, elle fonctionne. Quelqu'un pourrait me suggérer une solution a mon problème? merci d'avance ...

motta_42

K-lo

Peux tu donner un peu de ton code ?

Motta_42

int CComSerie::Lire(unsigned int Nb, char* pChaine)
{
	int Res=0;

	cout<<"NB = "<<Nb<<endl;

	Res = read ( COM , pChaine , Nb ); // read permet de lire sur le port serie

	cout<<" (dans CComSerie read) Res = "<<Res<<endl;
	
	if( Res == -1 )
	{
		printf("errno=%d\n", errno); // affichage du numéro de l'erreur
		cout<<" (dans CComSerie read) Erreur Lecture"<<endl;
	}
	
	return Res;
}

ma trame envoyer est bonne je l'ai vérifier.
pour info: NB=9
Res=-1
Errno=11 ==> Ressource indisponible temporairement.
J"ai essayer la connection sous windows avec un logiciel elle fonctionne, mais pas sous linux, serait-ce un probleme de lecture/ecriture..?

Je cherche toujours, mais un petit coup de pouce serait le bien venu :)
Merci d'avance

K-lo

Je sais pas si ça doit réellement changer quelque chose mais essai comme ceci déjà :

int CComSerie::Lire()
{
   
   char pChaine[4096];
   int Res=0;
   memset(pChaine,0,sizeog(pChaine));

/* J'ai bien compris pourquoi tu avais mis des arguments mais pour du debug c'est pas mal de tester de cette manière*/
   cout<<"NB = "<<Nb<<endl;

   Res = read ( COM , &pChaine , sizeof(pChaine) );  

   cout<<" (dans CComSerie read) "<<pChaine<<endl;
   
   if( Res == -1 )
   {
      printf("errno=%d\n", errno); 
      cout<<" (dans CComSerie read) Erreur Lecture"<<endl;
   }
   
   return Res;
}
Motta_42

Malgré les modifications proposées je ne suis pas plus éclairé sur les problemes de mon programme. :( Sous linux, on pourrait croire que les ressources contenu sur la centrale thermique ( sur laquelle je doit lire ) sont innaccessible alors que la lecture sous windows avec le logiciel modpoll est d'une facilité déconcertante.

K-lo

Quote:
Malgré les modifications proposées je ne suis pas plus éclairé sur les problemes de mon programme.

A vrai dire ça m'étonne pas bcp mais des fois une mauvaise utilisation peut donnée de mauvais résultats.

ton descripteur COM est il correctement initialisé (je suppose que oui puisque tu arrive à écrire mais bon comme en théorie c'est plus facile à lire qu'a écrire...)

Autre chose que je connais depuis peu,
L'utilisation de select() :

http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/select.2.html

int CComSerie::Lire(unsigned int Nb, char* pChaine)
{
   int Res=0;
   fd_set rfds;
   FD_ZERO(&rfds);
   FD_SET(COM, &rfds);
   int retval = select(COM, &rfds, NULL, NULL, NULL);

   if(retval){
      Res = read ( COM , pChaine , Nb );
      cout<<" (dans CComSerie read) Res = "<<Res<<endl;
      if( Res == -1 )
      {
         printf("errno=%d\n", errno); // affichage du numéro de l'erreur
         cout<<" (dans CComSerie read) Erreur Lecture"<<endl;
         return -1;
      }
   }else{
      return –1 ; // par exemple
   }
   return Res;
   
}

Bon lis bien le lien que j'ai mis car j'ai répondu un peu rapidement... :?

Motta_42

J'ai lu le manuel pour select, fonction intérréssante elle me permet de savoir si je reçios une réponse ou pas et me permet de patienter pour la lecture, mais bon la on a un soucis avec la centrale elle meme :? , je donnerai plus d'informations sur select quand le soucis sera reglé :roll: