[C]problème read sur port série

problème read sur port série [C] - C - Programmation

Marsh Posté le 24-03-2004 à 14:15:41    

Hello,
 
J'essaie de lire et écrire sur le port série (/dev/ttySA0) de mon ipaq qui tourne la distribution Familiar. J'arrive bien à écrire, ça apparait nickel sur la console, mais par contre l'appel à read ne marche jamais : soit il retourne une erreur (-1) soit il ne retourne rien !!! Même quand je l'appelle avec read(fd, answ, 0), il devrait selon la man page de read me retourner 0, et l'appel est bloquant !!!!
 
Voici le code :
 

Code :
  1. #include <termios.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <sys/signal.h>
  8. #include <sys/types.h>
  9. #include <errno.h>
  10. #define BAUDRATE B115200
  11. #define MODEMDEVICE "/dev/ttySA0"
  12. #define _POSIX_SOURCE 1 /* code source conforme à POSIX */
  13. #define FALSE 0
  14. #define TRUE 1
  15. int main(int argc, char **argv)
  16. {
  17.   int fd, res;
  18.   struct termios oldtio,newtio;
  19.   struct sigaction saio;        /* définition de l'action du signal */
  20.   char *buf, *answ;
  21.   __sigset_t aide;
  22.   buf = (char *) malloc (10*sizeof(char));
  23.   answ = (char *) malloc (10*sizeof(char));
  24.   /* ouvre le port en mode non-bloquant (read retourne immédiatement) */
  25.   fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
  26.   if (fd <0) {perror(MODEMDEVICE); exit(-1); }
  27.   tcgetattr(fd,&oldtio); /* sauvegarde de la configuration courante */
  28.   /*valeur pour lecture non canonique : on reçoit tjrs le même nbre de bits */
  29.    bzero(&newtio, sizeof(newtio));
  30.    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
  31.    newtio.c_iflag = IGNPAR;
  32.    newtio.c_oflag = 0;
  33.    /* positionne le mode de lecture (non canonique, sans echo, ...) */
  34.    newtio.c_lflag = 0;
  35.    newtio.c_cc[VTIME]    = 0;   /* timer inter-caractères non utilisé */
  36.    newtio.c_cc[VMIN]     = 0;   /* read bloquant jusqu'à ce que 5 */
  37.                                   /* caractères soient lus */
  38.    tcflush(fd, TCIFLUSH);
  39.    tcsetattr(fd,TCSANOW,&newtio);
  40.    printf("je veux ecrire sur le port serie\n" );
  41.   buf = argv[1];
  42.   write(fd,buf,10);
  43.   printf("j'ai écrit %s\n", buf);
  44.   printf("je veux lire\n" );
  45.   res=read(fd,answ,0);
  46.   if (res == -1)
  47.    if (errno == EINTR) printf("read interrompu par le signal !!!\n" );
  48.   answ[res]=0;
  49.   printf("j'ai lu %d charactères: %s\n)",res, answ);
  50.   /* restaure les anciens paramètres du port */
  51.   tcsetattr(fd,TCSANOW,&oldtio);
  52.   return 0;
  53. }


 
Merci beaucoup !!!

Reply

Marsh Posté le 24-03-2004 à 14:15:41   

Reply

Marsh Posté le 24-03-2004 à 16:43:26    

cause du problème déteminée : Familiar fait un getty sur le même port que je veux lire ---> gros bordel ... en virant le getty, tout marche comme j'en ai envie !!!

Reply

Marsh Posté le 24-03-2004 à 17:03:43    

buf = (char *) malloc (10*sizeof(char));  
 
c'est tellement mieux de mettre un cast inutile et un sizeof(char) qui encore heureux faudra toujours 1 char buf[10] étant définivement une solution de looser

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed