Probleme read/write

Fermé
maxou22 - 23 juil. 2009 à 15:26
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 24 juil. 2009 à 09:48
Bonjour,
j'ai un petit souci dans un programme C où je souhaite faire un read puis un write le probleme c'est que mon read bloque tout et donc je ne peux jamais faire le write qui me permettrait d'ecrire ce que je veux lire.
Si quelqu'un a une solution merci d'avance.

9 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
24 juil. 2009 à 08:21
Merci pour les balises, c'est plus lisible.
Je ne suis pas à l'aise dans les histoires de ports. Mais ce que je remarque, c'est que dans tes fonction, tu fait un open, mais ni close, ni retour de l'identifiant. C'est pas propre.
C'est normal que tu envoie sur escc1 mais que tu réceptionnes sur escc0 ?
si le read ne reçoit rien, c'est normal qu'il bloque.
Où as tu été chercher te flags de open ? Il ne sont pas sur la man page http://www.manpagez.com/man/2/open/ (O_NOCTTY et O_DELAY).
Si j'ai bien compris en sorti le programme va jusqu'à "envoie OK" et ensuite il fige ?
1
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
23 juil. 2009 à 16:42
Comment ouvre tu ton fichier ?
Il faut lui préciser lors de l'ouverture que tu veux lire et écrire.
0
merci de me repondre tout d'abord.
J' ouvre mes fichiers avec open je te file mon code direct c'est plus simple c'est du basic basic.
Je cherche à faire un rebouclage sur 2 ports.

char tramerecue[100];
void envoi (int port ,char* donnee);
void reception (int port);
int main()
{
envoi(1,"test");
printf("envoi ok\n");
reception(0);
printf("reception envoi ok\n");

if (strncmp("test",tramerecue,4)!=0)
{
printf("%s",tramerecue);
printf("erreur lors du transfert 1 vers 0\n");
exit(1);
}
else printf("ok de 1 vers 0\n");
}


void envoi (int port,char *donnee)
{
int port1;
char buf[100];
if (port == 0)
{
if ((port1=open("/dev/escc0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
{
perror("serial port open");
}
else
{
fcntl(port1,F_SETFL,0);
}
}
else if (port == 1)
{
if ((port1=open("/dev/escc1", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
{
perror("serial port open");
}
else
{
fcntl(port1,F_SETFL,0);
}
}
else
{
printf("port non valide, le port doit etre 0 ou 1\n");
exit(1);
}
strcpy(buf, donnee);
int nbytes = strlen(buf);
int p = write(port1, buf ,nbytes);
// fflush(stdout); LA JE T AVOUE QUE JE SAIS PAS SI JE DOIS LE METTRE....
if (p<=0)
{
perror("write:");
}
}
void reception (int port)
{
int port1;
if (port == 0)
{
if ((port1=open("/dev/escc0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
{
perror("serial port open");
}
else
{
fcntl(port1,F_SETFL,0);
}
}
else if (port == 1)
{
if ((port1=open("/dev/escc1", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
{
perror("serial port open");
}
else
{
fcntl(port1,F_SETFL,0);
}
}
else
{
printf("port non valide, le port doit etre 0 ou 1\n");
exit(1);
}
int p=read(port1, tramerecue ,100);
if (p<=0)
{
perror("erreur due à:");
}

}
Ne soit pas impressionné pas la taille c'est tres simple. J'ai essayé de mettre la fonction envoi avant la reception mais quoie que je fasse reception bloque. Mais lorsque je fais un echo dans mon terminal avant d'appeler ma fonction la ça marche. Peut etre un pb de buffer tt ça...
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
23 juil. 2009 à 17:37
utilises les balises de code STP.
0

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

Posez votre question
comment on fait?
0


#include <stdio.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

char tramerecue[100];
void envoi (int port ,char* donnee);
void reception (int port);

int main()
{
envoi(1,"test");
printf("envoi ok\n");
reception(0);

printf("reception envoi ok\n");

if (strncmp("test",tramerecue,4)!=0)
{
printf("%s",tramerecue);
printf("erreur lors du transfert 1 vers 0\n");
exit(1);
}
else printf("ok de 1 vers 0\n");
}


void envoi (int port,char *donnee)
{
int port1;
char buf[100];
if (port == 0)
{
if ((port1=open("/dev/escc0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
{
perror("serial port open");
}
else
{
fcntl(port1,F_SETFL,0);
}
}
else if (port == 1)
{
if ((port1=open("/dev/escc1", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
{
perror("serial port open");
}
else
{
fcntl(port1,F_SETFL,0);
}
}

else
{
printf("port non valide, le port doit etre 0 ou 1\n");
exit(1);
}


strcpy(buf, donnee);
int nbytes = strlen(buf);
int p = write(port1, buf ,nbytes);
// fflush(stdout); JE SAIS PAS SI JE DOIS LE METTRE OU PAS .....
if (p<=0)
{
perror("write:");
}
}

void reception (int port)
{
int port1;
if (port == 0)
{
if ((port1=open("/dev/escc0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
{
perror("serial port open");
}
else
{
fcntl(port1,F_SETFL,0);
}
}
else if (port == 1)
{
if ((port1=open("/dev/escc1", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
{
perror("serial port open");
}
else
{
fcntl(port1,F_SETFL,0);
}
}

else
{
printf("port non valide, le port doit etre 0 ou 1\n");
exit(1);
}
int p=read(port1, tramerecue ,100);
if (p<=0)
{
perror("erreur due à:");
}
}

Voila je pense que cela peut venir d'un pb de buffer, et j'ai deja essayé de mettre envoi avant reception pour voir mais cela n'a rien donné
0
#include <stdio.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

	char tramerecue[100];
	void envoi (int port ,char* donnee);
	void reception (int port);

int main()
{	
//	char test = atol(argv[1]);
//	printf("%s",test);

	envoi(1,"test");
	printf("envoi ok\n");
	reception(0);
	
	printf("reception envoi ok\n");
	
	if (strncmp("test",tramerecue,4)!=0) 
		{
		printf("%s",tramerecue);
		printf("erreur lors du transfert 1 vers 0\n");
		exit(1);
		}
	else printf("ok de 1 vers 0\n");
}


void envoi (int port,char *donnee)
{
	int port1;
	char buf[100];
	if (port == 0)
		{
				if ((port1=open("/dev/escc0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
				{
				perror("serial port open");
				}
				else 
				{
				fcntl(port1,F_SETFL,0);
			       }
		}
	else if (port == 1)
		{
				if ((port1=open("/dev/escc1", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
				{
				perror("serial port open");
				}
				else
			 	{
				fcntl(port1,F_SETFL,0);
				}
		}
	else
		{
		printf("port non valide, le port doit etre 0 ou 1\n");
		exit(1);
		}

		strcpy(buf, donnee);
		int nbytes = strlen(buf);
		int p = write(port1, buf ,nbytes);
	//	fflush(stdout);                             ?????????????????????
		if (p<=0)
			{
			perror("write:");
			}
}

void reception (int port)
{	
	int port1;

	if (port == 0)
		{
				if ((port1=open("/dev/escc0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
				{
				perror("serial port open");
				}
				else 
				{
				fcntl(port1,F_SETFL,0);
			        }
		}
	else if (port == 1)
		{
				if ((port1=open("/dev/escc1", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK))==-1)
				{
				perror("serial port open");
				}
				else
			 	{
				fcntl(port1,F_SETFL,0);	
       	 		}
		}
	
	else
		{
		printf("port non valide, le port doit etre 0 ou 1\n");
		exit(1);
		}
			int p=read(port1, tramerecue ,100);
			if (p<=0)
			{
			perror("erreur due à:");
			}
}

En esperant que sa marche sinon dsl
0
oui c bien ça en sortie j'ai envoi ok puis figeage je prend note pour un eventuel close manquant je vais essayer de voir si ça change quelque chose et oui c'est normal que j'envoi sur escc1 et receptionne sur escc0. Je fais un rebouclage à l'aide d'un cable de ma fabrication sur les 2 ports en gros mon prog je ve que ce soit l'equivalent d'un echo/cat en shell.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
24 juil. 2009 à 09:48
pff...
Comme je te l'ai dit, je connais mal cet aspect de la programmation.
Mais es-tu sur que ton programme est assez rapide ?
Si le signal que tu envoies arrive avant de faire le read ?
essai en envoyant un buffer plus grand.
à ta place, je ferai un thread, ou alors deux processus : un écoutant l'autre envoyant, histoire de tester.
Comme ça, tu ouvres d'un coté en lecture, de l'autre en écriture, et tu fait des boucle while en attendant de recevoir quelque chose.
0