Longfield | 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 :
- #include <termios.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/signal.h>
- #include <sys/types.h>
- #include <errno.h>
- #define BAUDRATE B115200
- #define MODEMDEVICE "/dev/ttySA0"
- #define _POSIX_SOURCE 1 /* code source conforme à POSIX */
- #define FALSE 0
- #define TRUE 1
- int main(int argc, char **argv)
- {
- int fd, res;
- struct termios oldtio,newtio;
- struct sigaction saio; /* définition de l'action du signal */
- char *buf, *answ;
- __sigset_t aide;
- buf = (char *) malloc (10*sizeof(char));
- answ = (char *) malloc (10*sizeof(char));
- /* ouvre le port en mode non-bloquant (read retourne immédiatement) */
- fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
- if (fd <0) {perror(MODEMDEVICE); exit(-1); }
- tcgetattr(fd,&oldtio); /* sauvegarde de la configuration courante */
- /*valeur pour lecture non canonique : on reçoit tjrs le même nbre de bits */
- bzero(&newtio, sizeof(newtio));
- newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
- newtio.c_iflag = IGNPAR;
- newtio.c_oflag = 0;
- /* positionne le mode de lecture (non canonique, sans echo, ...) */
- newtio.c_lflag = 0;
- newtio.c_cc[VTIME] = 0; /* timer inter-caractères non utilisé */
- newtio.c_cc[VMIN] = 0; /* read bloquant jusqu'à ce que 5 */
- /* caractères soient lus */
- tcflush(fd, TCIFLUSH);
- tcsetattr(fd,TCSANOW,&newtio);
- printf("je veux ecrire sur le port serie\n" );
- buf = argv[1];
- write(fd,buf,10);
- printf("j'ai écrit %s\n", buf);
- printf("je veux lire\n" );
- res=read(fd,answ,0);
- if (res == -1)
- if (errno == EINTR) printf("read interrompu par le signal !!!\n" );
- answ[res]=0;
- printf("j'ai lu %d charactères: %s\n)",res, answ);
- /* restaure les anciens paramètres du port */
- tcsetattr(fd,TCSANOW,&oldtio);
- return 0;
- }
|
Merci beaucoup !!! |