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
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
A voir également:
- Fonction write c
- Fonction si et - Guide
- Fonction moyenne excel - Guide
- Fonction somme excel - Guide
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
- Fonction filtre excel n'existe pas - Forum Excel
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
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 ?
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 ?
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
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.
Il faut lui préciser lors de l'ouverture que tu veux lire et écrire.
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...
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...
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
23 juil. 2009 à 17:37
utilises les balises de code STP.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#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é
#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
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.
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
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.
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.